为啥我在 UITableCellView 中的 UIView 中的 UILabel 在正确的数据库调用后没有更新(似乎与单元重用有关)?
Posted
技术标签:
【中文标题】为啥我在 UITableCellView 中的 UIView 中的 UILabel 在正确的数据库调用后没有更新(似乎与单元重用有关)?【英文标题】:Why is my UILabel in a UIView in a UITableCellView not updating after a correct database call, (it seems cell reuse related)?为什么我在 UITableCellView 中的 UIView 中的 UILabel 在正确的数据库调用后没有更新(似乎与单元重用有关)? 【发布时间】:2011-11-03 19:58:49 【问题描述】:我有一个从核心数据数据库获取计数的 UITableview 单元。 tallyTable 位于 UITab 视图内的视图控制器中。我有一个 NSLog 语句,它在更新时打印出计数值。另一个选项卡有一个列表,用于更改计数的来源(不同日期)。我正在使用带有 ARC 的 ios5,目标是 iOS 4.2。
这就是问题所在。当我加载应用程序时,最后选择的日期的正确计数会显示在表格选项卡中。如果我然后转到日期选项卡并更改日期并返回到计数选项卡,则显示没有变化。但是,计数选项卡上的 viewWillAppear 会运行,并且当表格在 cellForIndexPath 中循环时,我的 NSLog 语句会打印出所有正确的新值。如果我然后将顶部标签滚动到屏幕外并将标签更新为新值。
我已经在 UILabel、UITableViewCell、UITableView 和加载表格的视图控制器上尝试了 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;
我已经阅读了超过半打其他类似的问题。到目前为止,已经投入了大约三个小时来尝试解决这个问题。
编辑:我认为我通过使用导航控制器将***视图控制器再次推送到视图来修复它。我现在承认,这在各方面都感觉像是一个经典的笨拙黑客。当视图被推送时,一切都会更新并且是无缝的。但是,为了有一个固定的页脚来为表格按钮进行选择设置,我使用了一个带有两个子视图的 UIView,一个在顶部的 UITableView 和一个在下面带有四个按钮的简单 UIView。
按钮上的标题需要随着数据源的变化而变化。现在,当视图控制器被推到视图上时,它会遮盖我的固定页脚视图。因此,我将固定页脚插入 UITableview 并且一切看起来都很好,直到我滚动 UITableView 并且页脚随之向上滚动。该表基本上是一个计数表,每个项目旁边都有按钮,页脚有四个按钮来记录计数项目的颜色。假设下一个项目是绿色乐高积木,您可以点击页脚中的“绿色”和表格中“乐高积木”旁边的按钮。当我用两个子视图推送视图控制器时,UITableview 标签不会更新。因此,tableview 需要自己推送(据我所知)。
回答:请参阅下面的评论,但最终我需要重新加载可见的 UITableView 数据和它背后的委托 UITableView 控制器数据。
【问题讨论】:
【参考方案1】:我会试一试。首先,您使用的是 ARC 吗?如果没有,您需要在分配/初始化新单元格时添加autorelease
。否则,它就可以了。
如果我正确理解您的问题:
tableView 在应用启动时显示正确的数据
您从带有 tableView 的选项卡切换并更改 tableView 数据源
您切换回带有 tableView 的选项卡,您会看到(通过 NSLog)表格单元格重新加载了正确的数据,但旧数据在单元格中仍然可见
如果您将一个单元格从显示屏上滚动并返回强制它刷新,则它包含正确的数据
一些想法:
tableView 在其视图出现时不会自动重新加载。每当数据源更改时,您都需要调用[tableView reloadData]
。这与当前是否显示 tableView 无关。我的猜测是仅此一项就可以解决您的问题。
您不需要在单元格上调用setNeedsLayout
,除非您希望单元格根据数据重新布局其子视图。你也不需要setNeedsDisplay
。
我假设没有其他复杂的因素(例如多个 tableView 显示相同的数据)会造成混淆。
【讨论】:
这一切似乎都是正确的。我正在运行 reloadData,正如我所说,传递给 label.text 的值是正确的,标签在滚动并返回屏幕之前不会显示新值。 好吧,听起来你的项目有些奇怪。您是否有可能拥有多个 tableView,而您认为正在重新加载的那个不是正确的?也许发布更多代码,您如何设置视图以及数据源如何触发表重新加载。 花了我很长时间,但你正确地指出了我。 “固定页脚”是一个 UIView,而表格部分是一个 UITableView,其中一个 UITableView 控制器作为其委托。 (我需要一些额外的功能,而我不希望与表格一起打包)。解决方案是我需要重新加载 UITableView 和委托 UITableViewController.tableView 感谢您的敏锐眼睛! 很高兴你知道了。我会“修复”您的控制器/视图层次结构以消除不需要的对象并阐明逻辑。如果不出意外,这将清理您的代码并消除不需要的对象。听起来您可能有两个不同的 tableView,将 tableView 委托/数据源设置为不是活动视图控制器的控制器有点奇怪。【参考方案2】:如果你使用 prepare for reuse 方法,记得用 [super prepareForReuse] 覆盖原来的方法;
如果上述方法不起作用,另一种方法是按照此处所述重新设置单元格。
我使用与我的一些集合视图相同的方法:我们应该删除/重置您在其中创建/将其添加到单元格内容的子视图。这意味着我们需要为每一行完全设置每个单元格的数据。
我将代码重置数据值从准备重用移动到我设置值的位置,我工作很简单!
在我的 CustomCell.m 中:
- (void)configCellWith:(id)item At:(NSUInteger)row
if (_scrollView)
[[_scrollView subviews]
makeObjectsPerformSelector:@selector(removeFromSuperview)];
_scrollView = nil;
[_scrollView removeFromSuperview];
else
CGFloat y = labelHeight+15;
float scrollHeight = _imgArray.count*200;
_scrollView=[[UIScrollView alloc]initWithFrame:CGRectMake(10, y,SCREEN_WIDTH-20, scrollHeight)];
_scrollView.scrollEnabled=YES;
_scrollView.userInteractionEnabled=YES;
_scrollView.layer.masksToBounds = YES;
[self.contentView addSubview:_scrollView];
记得也要适当地改变你的数据源。
【讨论】:
以上是关于为啥我在 UITableCellView 中的 UIView 中的 UILabel 在正确的数据库调用后没有更新(似乎与单元重用有关)?的主要内容,如果未能解决你的问题,请参考以下文章
如何阻止 UILabel 在 UITableCellView 中用“...”截断
了解自定义 UITableCellView 的创建——从 MonoTouch 中的 Nibs 加载
如何在 UITableCellView 中设置 imageView 属性以仅显示背景颜色?