表格中没有刷新单元格标签

时间:2013-02-04 15:49:32

标签: iphone ios objective-c xcode ipad

我试图在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

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

由于

3 个答案:

答案 0 :(得分:0)

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

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

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

(E:F; B)

答案 1 :(得分:0)

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

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

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

(你真的不需要把它变成一个局部变量,但它更合适,因为你不需要引用你离开这个方法后创建的最后一个标签)

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

...

答案 2 :(得分:0)

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

最好参考此an excellent guide