Data repeat in UITableView when scrolling

前端 未结 4 1879
青春惊慌失措
青春惊慌失措 2020-12-10 22:46

I use bellow codes to show data on TableView but when scrolling, data repeat and other data lost.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tab         


        
相关标签:
4条回答
  • 2020-12-10 23:26

    This problem is generated because Your UITableView Reuse Cell instant of create new one. I give you some suggestion that may be helpful for you.

    1) add Controller in between

     - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath   
      {
        static NSString *CellIdentifier = @"Cell";
    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil)
        {
            /// Your code of initialization of controller;
        }
    
        /// set property of controllers such like (Text UILabel, image of UIImageView...etc) .
     return cell;
    
    }
    

    1) Add Your Controller to cell.contentView.

    EDITED:

    Before You follow my Edited Answer i want to tell you that following code is bad for memory management because it will create new cell for each rows of UITableView, so be careful for it.

    But it is better for if UITableView Have Limited row about (50-100 may be ) os use following code if is it suitable for you.

    NSString *CellIdentifier = [NSString stringWithFormat:@"S%1dR%1d",indexPath.section,indexPath.row];
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if(cell == nil)
        {
              /// Your whole code of controllers;
        } 
    
    0 讨论(0)
  • 2020-12-10 23:30

    You are setting the text of the label only when creating a new cell. However, during cell reuse, new cell is not created. Hence your code for setting/changing text is not working. You can use this modified code.

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    
        static NSString *CellIdentifier = @"CellIdentifier";
    
        UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        UILabel *FileNameLabel=nil;
        if (cell == nil)
        {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    
            FileNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 0, 100, 30)];
            FileNameLabel.tag = 1001;
            FileNameLabel.backgroundColor = [UIColor clearColor];
            FileNameLabel.font = [UIFont fontWithName:@"Helvetica" size:16];
            FileNameLabel.font = [UIFont boldSystemFontOfSize:16];
            FileNameLabel.textColor = [UIColor blackColor];
            [cell.contentView addSubview: FileNameLabel];
            [FileNameLabel release];
        }
        if(!FileNameLabel)
            FileNameLabel = [cell.contentView viewWithTag:1001];
        FileNameLabel.text =[FileCompletedArray objectAtIndex:indexPath.row];
    
        return cell;
    }
    

    Alternatively you can use the default textLabel instead of creating and adding new label

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
        static NSString *CellIdentifier = @"CellIdentifier";
    
        UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        UILabel *FileNameLabel=nil;
        if (cell == nil)
        {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
            cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:16];
            cell.textLabel.font = [UIFont boldSystemFontOfSize:16];
            cell.textLabel.textColor = [UIColor blackColor];
        }
        cell.textLabel.text =[FileCompletedArray objectAtIndex:indexPath.row];
    
        return cell;
    }
    
    0 讨论(0)
  • 2020-12-10 23:30

    I also faced same problem, the problem occurs when we reuse the cells. At the time of reusing the data is already present in it and we write some more data also, to sort out this, i did a minor change to my table view delegate method cellForRowAtIndexPath. Here the code which i use always using table view.

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    if (!cell) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"];
    }
    for (UIView *view in cell.contentView.subviews) {
        [view removeFromSuperview];
    }
    
    return cell;
    

    }

    The for loop gets executed when we are reusing some cell and what it does is removing all the previous data present in UITableViewCell

    Hope this will help someone.

    0 讨论(0)
  • 2020-12-10 23:43

    use cell Identifier different

    For example like bellow...

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    
        NSString *CellIdentifier = [NSString stringWithFormat:@"%d,%d",indexPath.section,indexPath.row];
    
        UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil)
        {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
            /// write your code here..
        }
    }
    

    OR set nil like bellow..

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    
        //static NSString *CellIdentifier = @"CellIdentifier";    
    
        UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:nil];
        if (cell == nil)
        {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease];
            /// write your code here..
        }
    }
    
    0 讨论(0)
提交回复
热议问题