我试图在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
再次,我不知所措,因为最后一行正确刷新。但其他人都没有。
由于
答案 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