iphoneuitableviewlabelipodviewcontroller

UITableView data not getting flushed and unable to reload new data


I'm populating the table consists of 4 labels in each row on button click dynamically.

When I'm trying to insert different data into the same table dynamically, it doesn't flushes the old data and hence the old data get overlapped on new data.

What changes do I need to make?

*.m

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    {
     return 1;   
    }
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if(tableView==myTableView){

        return [tableData count];
    }
    else if(tableView==aTableView){
        return [a count];
    }
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    if(tableView==myTableView){
    static NSString *MyIdentifier = @"MyIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
    }
    cell.textLabel.font=[UIFont fontWithName:@"Arial" size:12.0];
    cell.textLabel.text = [tableData objectAtIndex:indexPath.row]; 
    cell.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    return cell;
}
    else if(tableView==aTableView){

        static NSString *CellIdentifier=@"CellIdentifier"; 

        static NSInteger StateTag = 1;
        static NSInteger CapitalTag = 2;
        static NSInteger StateTag1 = 3;
        static NSInteger StateTag2 = 4;


        UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if(cell == nil){

                cell=[[[UITableViewCell alloc]initWithFrame:CGRectZero reuseIdentifier:CellIdentifier]autorelease];
                CGRect frame;
                frame.origin.x = 10; 
                frame.origin.y = 5;
                frame.size.height = 35;
                frame.size.width = 80;


                UILabel *capitalLabel = [[UILabel alloc] initWithFrame:frame];
                capitalLabel.tag = CapitalTag;
                [cell.contentView addSubview:capitalLabel];

                frame.origin.x += 135;
                UILabel *stateLabel = [[UILabel alloc] initWithFrame:frame];
                stateLabel.tag = StateTag;
                [cell.contentView addSubview:stateLabel];

                frame.origin.x += 100;
                UILabel *stateLabel1 = [[UILabel alloc] initWithFrame:frame];
                stateLabel1.tag = StateTag1;
                [cell.contentView addSubview:stateLabel1];

                frame.origin.x += 100;
                UILabel *stateLabel2 = [[UILabel alloc] initWithFrame:frame];
                stateLabel2.tag = StateTag2;
                [cell.contentView addSubview:stateLabel2];

                capitalLabel = (UILabel *) [cell.contentView viewWithTag:CapitalTag];
                stateLabel = (UILabel *) [cell.contentView viewWithTag:StateTag];
                stateLabel1 = (UILabel *) [cell.contentView viewWithTag:StateTag1];
                stateLabel2 = (UILabel *) [cell.contentView viewWithTag:StateTag2];

                capitalLabel.text=[a objectAtIndex:indexPath.row];
                stateLabel.text = [b objectAtIndex:indexPath.row];
                stateLabel1.text = [c objectAtIndex:indexPath.row];
                stateLabel2.text = [d objectAtIndex:indexPath.row];
            }            
            return cell;
        }
}


-(IBAction)btnClicked:(id)sender{
    NSMutableDictionary *cells = (NSMutableDictionary*)[self.aTableView valueForKey:@"_reusableTableCells"];
    [cells removeAllObjects];

    [self gainer];
}

-(IBAction)btnClicked1:(id)sender {

    [self looser];
}

-(void)gainer{   

    arr1=[[NSMutableArray alloc]init];
    arr2=[[NSMutableArray alloc]init];
    a=[[NSMutableArray alloc]init];
    b=[[NSMutableArray alloc]init];
    c=[[NSMutableArray alloc]init];
    d=[[NSMutableArray alloc]init];

    [a removeAllObjects];
    [b removeAllObjects];
    [c removeAllObjects];
    [d removeAllObjects];

    //POPULATING OF ARRAYS(a,b,c,d) IS DONE HERE. NOW using ReloadData to populate table.


    [self.aTableView reloadData];
}

-(void)looser{
    //SIMILAR LOGIC AS DEFINED IN gainer() method
}



- (void)viewDidLoad {

    myTableView = [[UITableView alloc]initWithFrame:CGRectMake(200, 31, 310,170)];
    myTableView.delegate = self;
    myTableView.dataSource = self;
    [self.view addSubview:myTableView];

    //code for fetch
    arr1=[[NSMutableArray alloc]init];
    arr2=[[NSMutableArray alloc]init];
    a=[[NSMutableArray alloc]init];
    b=[[NSMutableArray alloc]init];
    c=[[NSMutableArray alloc]init];
    d=[[NSMutableArray alloc]init];

    aTableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen]applicationFrame] style:UITableViewStyleGrouped];
    aTableView.dataSource = self;
    aTableView.delegate = self;
    aTableView.frame = CGRectMake(100, 150, 200, 300);
    aTableView.tag=1;
    [self.view addSubview:aTableView];

    [super viewDidLoad];
}

ANY SUGGESTIONS?


Solution

  • Create a custom cell with a XIB. This will simplify your code quite a bit and actually may speed it up because you aren't doing tag lookups. Create direct properties for the labels that need to be set. If a label needs to be blank, pass nil to the text property of the label.

    Another tip is to not do subview positioning in tableview:cellForRowAtIndexPath: this can have unpredictable results and should instead use tableView:willDisplayCell:forRowAtIndexPath:, instead.

    BTW, you have several leaks with all your labels that you allocated but didn't release.