我有一个 UITableview 单元格,它从核心数据数据库中获取计数。 tallyTable 位于 UITab View 内的 View Controller 中。我有一个 NSLog 语句,每当更新时都会打印出计数值。另一个选项卡有一个列表,用于更改计数的来源(不同的日期)。我正在使用 iOS5 和针对 iOS 4.2 的 ARC。
问题就在这里。当我加载应用程序时,最后选定日期的正确计数会显示在表格选项卡中。如果我然后转到“日期”选项卡并更改日期并返回到“计数”选项卡,则显示不会发生任何变化。但是,计数选项卡上的 viewWillAppear 会运行,并且当表在 cellForIndexPath 中循环时,我的 NSLog 语句会打印出所有正确的新值。如果我然后将顶部标签滚动出屏幕并将标签更新为新值。
我已经在 UILabel、UITableViewCell、UITableView 和加载表格的 View Controller 上尝试了 setNeedsLayout 和 setNeedsDisplay。我尝试更改 CellReuse 标识符,以便它永远不会重用单元格。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
CollectionItemTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[CollectionItemTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSUInteger row = [indexPath row];
cell.textLabel.text = [[self.collectionKeys objectAtIndex:row] valueForKey:@"collectionTitle"];
NSInteger test1 = indexPath.row + 150;
NSLog(@"tag = %i", test1);
cell.tallyButton.tag = test1;
NSNumber * questionID = [[self.collectionKeys objectAtIndex:row] valueForKey:@"answerID"];
cell.tallyLabel.text = [NSString stringWithFormat:@"%i",[self updatePointTotal:questionID]];
NSLog(@"Collection text should be = %@", [NSString stringWithFormat:@"%i",[self updatePointTotal:questionID]]);
[cell setNeedsLayout];
return cell;
}
我已经阅读了六个其他类似的问题。到目前为止,我们投入了大约三个小时来尝试解决这个问题。
编辑:我想我通过使用导航 Controller 将顶级 View Controller 再次推到 View 上来修复它。我现在承认,这在各方面都感觉像是一个典型的笨拙黑客。当 View 被推送时,所有内容都会更新并且是无缝的。然而,为了有一个固定的页脚来对表格按钮进行选择设置,我使用了一个带有两个 subview 的 UIView,一个位于顶部的 UITableView 和一个带有下面四个按钮的简单 UIView。
按钮上的标题需要随数据源而变化。现在,当 View Controller 被推到 View 上时,它会遮挡我的固定页脚 View 。因此,我将固定页脚插入 UITableview 中,一切看起来都很好,直到我滚动 UITableView 并且页脚随之向上滚动。该表基本上是一个统计表,每个项目旁边都有按钮,页脚中有四个按钮用于记录统计项目的颜色。假设下一个项目是绿色乐高,您可以点击页脚中的“绿色”和表格中“乐高”旁边的按钮。当我用两个 subview 推送 View Controller 时,UITableview 标签不会更新。因此, TableView 需要自行推送(据我所知)。
答案:请参阅下面的评论,但最终我需要重新加载可见的 UITableView 数据及其背后的委托(delegate) UITableView Controller 数据。
最佳答案
我会尝试一下。首先,你使用ARC吗?如果没有,您需要在分配/初始化新单元时添加autorelease
。否则,保持原样就可以了。
如果我正确理解你的问题:
tableView 在应用启动时显示正确的数据
您从带有 tableView 的选项卡切换并更改 tableView 数据源
您切换回带有 tableView 的选项卡,您会看到(通过 NSLog)表格单元格已重新加载了正确的数据,但旧数据在单元格中仍然可见
如果您将单元格滚动离开显示屏并返回强制其刷新,则它包含正确的数据
一些想法:
当 tableView 的 View 出现时,它不会自动重新加载。每当数据源发生变化时,您都需要调用
[tableView reloadData]
。这与 tableView 当前是否显示无关。我猜仅此一项就能解决您的问题。您不需要在单元格上调用
setNeedsLayout
,除非您希望单元格根据数据重新布局其 subview 。您也不需要setNeedsDisplay
。我假设没有其他复杂的因素(例如多个 tableView 显示相同的数据)可能会造成困惑。
关于ios - 为什么我的 UITableView 中的 UIView 中的 UILabel 在正确的数据库调用后没有更新(似乎与单元格重用相关)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8001064/