0

我一直试图弄清楚这一点。我在自己的 xib 文件中创建了一个自定义单元格。在我的视图控制器中,我设置了一个带有部分的表视图控制器。被拉入表视图的数据是基于我拥有的一些核心数据的获取请求控制器。我在 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.
4

1 回答 1

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:在视图生命周期中调用一次,例如 in viewDidLoad,而不是每次需要新单元格时调用。此外,您应该创建一个新单元格cell == nil而不是使用dequeueReusableCellWithIdentifier:. 例如

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CustomCell"];
于 2012-04-18T23:03:23.880 回答