ios - 为什么我的 UITableView 中的 UIView 中的 UILabel 在正确的数据库调用后没有更新(似乎与单元格重用相关)?

标签 ios uitableview uilabel

我有一个 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)表格单元格已重新加载了正确的数据,但旧数据在单元格中仍然可见

  • 如果您将单元格滚动离开显示屏并返回强制其刷新,则它包含正确的数据

一些想法:

  1. 当 tableView 的 View 出现时,它不会自动重新加载。每当数据源发生变化时,您都需要调用[tableView reloadData]。这与 tableView 当前是否显示无关。我猜仅此一项就能解决您的问题。

  2. 您不需要在单元格上调用 setNeedsLayout ,除非您希望单元格根据数据重新布局其 subview 。您也不需要 setNeedsDisplay

  3. 我假设没有其他复杂的因素(例如多个 tableView 显示相同的数据)可能会造成困惑。

关于ios - 为什么我的 UITableView 中的 UIView 中的 UILabel 在正确的数据库调用后没有更新(似乎与单元格重用相关)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8001064/

相关文章:

uitableview - 更改 ViewController 时保持原型(prototype)单元的 UISwitch 状态

iphone - 如何让UILabel中的文字填满UILabel中的所有空间?

iphone - 带有 UIMenucontroller 的 UILabel 不会放弃触摸外部的第一响应者

ios - void(^)(NSData*) 是什么意思?

ios - 从 iOS 中的另一个 ViewController 访问按钮?

ios - 我如何像在 Instagram 中一样向它添加评论并允许其他用户也对图片发表评论

ios - 旧的 RPG 滚动文本,但用(点点点)分解文本 block

ios - 滚动 UITableView 时 UITableViewCell 位置发生变化

ios - swift 的新手 : Why is the Timer not updating to the UILabel?

ios - 向上滚动 UITableView 单元格然后展开它