IOS自定义单元格,标签在重复使用单元格时显示错误的文本

时间:2012-04-18 22:54:40

标签: objective-c ios

我一直试图弄清楚这一点。我在自己的xib文件中创建一个自定义单元格。在我的视图控制器中,我设置了一个带有剖面的表视图控制器。被拉入表View的数据基于我的一些核心数据的获取请求控制器。我在cellForRowAtIndexPath函数中设置了自定义单元格。我正在为此函数中的每个单元格创建一个标签,并使用来自托管对象的一些数据填充标签。我第一次跑的时候一切都好看。但是,当我尝试向上和向下滚动并重新使用新单元格时,标签中的数据将被放置在错误的单元格中。我已经看到和听说过这与细胞的重复使用有关。但是,没有看到很多关于纠正这个问题的例子。下面是我在cellForRowAtIndexPath函数中的一些代码。如果可能需要任何其他输入,请告诉我。谢谢你的帮助。

-(UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:@"CustomCell"];

    /* do this to get unique value per cell due to sections. */
    NSInteger indexForCell = indexPath.section * 1000 + indexPath.row + 1;

    NSManagedObject *managedObject = [fetchedResultsController objectAtIndexPath:indexPath];



    NSString *lastSession = nil;
    UILabel *lastSessionLabel = nil;
    if(cell == nil) {

        lastSession = [managedObject valueForKey:@"last_session"];

        [self.tableView registerNib:[UINib nibWithNibName:@"CustomCell" 
                                                   bundle:[NSBundle mainBundle]] 
             forCellReuseIdentifier:@"CustomCell"];

        self.tableView.backgroundColor = [UIColor clearColor];
        cell = [aTableView dequeueReusableCellWithIdentifier:@"CustomCell"];

        lastSessionLabel = [[UILabel alloc]initWithFrame:CGRectMake(410,55, 89, 35)];
        lastSessionLabel.textAlignment = UITextAlignmentLeft;
        lastSessionLabel.tag = indexForCell;
        lastSessionLabel.font = [UIFont systemFontOfSize:17];
        lastSessionLabel.highlighted = NO;
        lastSessionLabel.backgroundColor = [UIColor clearColor];

        cell.contentView.tag = indexForCell;
        [cell.contentView addSubview:lastSessionLabel];
    } else {
        lastSessionLabel = (UILabel *)[cell viewWithTag:indexForCell];
    }

        if (lastSession && lastSession.length) {        
            lastSessionLabel.text = lastSession;
        } 


    cell.textLabel.text = [NSString stringWithFormat:@"%@%@%@%@", @"Dr. ",
                           [managedObject valueForKey:@"first_name"], 
                           @" " , 
                           [managedObject valueForKey:@"last_name"]];

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    cell.editingAccessoryType = UITableViewCellAccessoryNone;


    return cell;
}

**修订代码**

以下是对代码的更改:在viewDidLoad中如下:

 - (void)viewDidLoad
{
    [super viewDidLoad];
   [self.tableView registerNib:[UINib nibWithNibName:@"CustomCell" 
                                           bundle:[NSBundle mainBundle]] 
         forCellReuseIdentifier:@"CustomCell"];

       self.tableView.backgroundColor = [UIColor clearColor];
  }     

 in -(UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:  (NSIndexPath *)indexPath {
  UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:@"CustomCell"];
    NSInteger indexForCell = indexPath.section * 1000 + indexPath.row + 1;
    NSLog(@"index for cell: %d",indexForCell);

    NSManagedObject *managedObject = [fetchedResultsController objectAtIndexPath:indexPath];


    NSString *lastSession = [managedObject valueForKey:@"last_session"];
 UILabel *lastSessionLabel = nil;
    if(cell == nil) {
        NSLog(@"Cell is nil! %@", [managedObject valueForKey:@"first_name"]);

         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CustomCell"];


        self.tableView.backgroundColor = [UIColor clearColor];
   }    
        lastSessionLabel = [[UILabel alloc]initWithFrame:CGRectMake(410,55, 89, 35)];
        lastSessionLabel.textAlignment = UITextAlignmentLeft;
        lastSessionLabel.tag = indexForCell;
        lastSessionLabel.font = [UIFont systemFontOfSize:17];
        lastSessionLabel.highlighted = NO;
        lastSessionLabel.backgroundColor = [UIColor clearColor];


        [cell.contentView addSubview:lastSessionLabel];
        /* Appropriate verbiage for nil last session. */
       if (lastSession && lastSession.length) {        
            lastSessionLabel.text = lastSession;
        }   
 return cell;  
}

 I am still having issues again with the label cell text changing when I scroll for different cells. I read some where about maybe having to use the prepareForReuse function for this.

1 个答案:

答案 0 :(得分:1)

您只在创建新单元格时获取lastSession。尝试将此行放在if(cell == nil)语句之前。

lastSession = [managedObject valueForKey:@"last_session"];

即。这样:

NSString *lastSession = [managedObject valueForKey:@"last_session"];
而不是这个:

NSString *lastSession = nil;

<强>更新

您还为两个视图设置了相同的标记:

lastSessionLabel.tag = indexForCell;
...
cell.contentView.tag = indexForCell;

根据您的代码示例,您应该只使用第一行,即设置lastSessionLabel的标记

第二次更新

您还应该只在视图生命周期中调用一次registerNib:,例如在viewDidLoad中,并非每次需要新单元格时。此外,您应该创建一个新的单元格cell == nil,而不是使用dequeueReusableCellWithIdentifier:。 E.g。

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CustomCell"];