0

我试图在 viewDidAppear 方法访问中调用我的表行上的 reloadData。但是,我的单元格没有刷新它们的值,我不知道为什么,因为似乎所有内容都按照预期的顺序访问。更奇怪的是,实际上 1 行确实会刷新,但其他行都不会。

这是我的代码...

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{     
  // Set up the cell...
  static NSString *CellWithIdentifier = @"Cell";
  UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellWithIdentifier];
  NSLog(@"generating cell contents");
if (cell == nil)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellWithIdentifier];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    cell.textLabel.text = [_tableGroup.options objectAtIndex:rowcount];
    rowcount++;

    //label for currently selected/saved setting
    _currentSetting = [[UILabel alloc] initWithFrame:CGRectMake(160, 8, 115, 25)];
    [_currentSetting setFont:[UIFont systemFontOfSize:14]];
    _currentSetting.backgroundColor = [UIColor clearColor];
    _currentSetting.textColor = [UIColor blueColor];
    _currentSetting.textAlignment = NSTextAlignmentRight;


    [cell.contentView addSubview:_currentSetting];
    NSLog(@"added new label to cell");
}

//depending on the setting, set the label in the cell to what is currently selected
if (indexPath.section == 1 && indexPath.row == 0) {
    _currentSetting.text = [NSString stringWithFormat:@"%@ %@",[settings.mapDistance stringValue], NSLocalizedString(@"MILES_IDENTIFIER", nil)];
    NSLog(@"setting map distance label: %@", settings.mapDistance);
}
else if(indexPath.section == 1 && indexPath.row == 1)
{
    _currentSetting.text = [NSString stringWithFormat:@"%@ %@",[settings.maxCustomers stringValue], NSLocalizedString(@"ITEMS_IDENTIFIER", nil)];
    NSLog(@"setting max customers: %@", settings.maxCustomers);
}
else if(indexPath.section == 2)
{
    _currentSetting.text = [NSString stringWithFormat:@"%@ %@",[settings.maxProducts stringValue], NSLocalizedString(@"ITEMS_IDENTIFIER", nil)];
    NSLog(@"setting max products: %@", settings.maxProducts);
}

return cell;
}

基于这段代码,我用我的 NSLOGS 得到这个输出。

这是创建视图时单元格的第一次运行。它生成 4 个单元格,在每个单元格中放置标签,并在其中 3 个标签中放入一个值。

 generating cell contents
 added new label to cell
 generating cell contents
 added new label to cell
 setting map distance: 15
 generating cell contents
 added new label to cell
 setting max customers: 250
 generating cell contents
 added new label to cell
 setting max products: 150

在这一点上,我点击了一行,转到另一个屏幕,现在已经返回。如您所见,地图距离是不同的。尽管没有显示任何更改,即使在重新加载过程中访问了更改标签文本的代码。

 reloading data
 generating cell contents
 generating cell contents
 setting map distance: 25
 generating cell contents
 setting max customers: 250
 generating cell contents
 setting max products: 150

再次,我不知所措,因为最后一行确实刷新了。但其他人都没有。

谢谢

4

3 回答 3

0

第二次,您可以看到“ added new label to cell”没有被调用,因此您正在重新使用旧的 tableViewCell。

请注意,您不会_currentSetting在重新使用单元格时进行设置,仅在创建新单元格时进行设置。So_currentSetting设置为创建的最后一个新单元格,很可能是表中的最后一个单元格。

您需要确保设置_currentSetting为正确的标签(可能通过使用viewWithTag: 或类似的东西)。

(e:f;b)

于 2013-02-04T15:55:48.897 回答
0

当你重新加载你的 tableView 时,单元格已经存在并从 tableView 中出列,所以条件if (cell == nil)返回 false,并且单元格创建代码没有执行。

在该单元格创建代码中,您正在为其分配一个值_currentSetting,然后假设该值是正确的,然后继续执行该代码。但是,当未执行单元格创建代码时,该值指向最新创建的单元格,因此不会更新。

要解决此问题:将 _currentSetting 设为局部变量并将代码更改为如下所示:

(您实际上并不需要将其设为局部变量,但它更合适,因为您实际上不需要引用离开此方法后创建的最后一个标签)

UILabel *_currentSetting = nil;
if (cell == nil) {
    _currentSetting = ...
    _currentSetting.tag = 123;
}
else
    _currentSetting = [cell.contentView viewWithTag:123];

...
于 2013-02-04T15:55:55.703 回答
0

这里的问题是第二次(当你重新加载视图时)_currentSetting 没有有效的内存。所以最好实现一个自定义单元并完成这项工作

最好参考这个优秀的指南

于 2013-02-04T16:14:42.207 回答