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

Ios 为什么UITableCellView中UIView中的我的UILabel在正确的数据库调用后没有更新(似乎与单元重用相关)?,ios,uitableview,uilabel,Ios,Uitableview,Uilabel,我有一个UITableview单元格,它从核心数据数据库中获取计数。tallyTable位于UITab视图内的视图控制器中。我有一个NSLog语句,每当它被更新时,它就会打印出计数值。另一个选项卡有一个列表,用于更改盘点的来源(不同的日期)。我使用的是iOS5,目标是iOS4.2 问题出在这里。当我加载应用程序时,表选项卡中会显示上一个选定日期的正确计数。如果我转到“日期”选项卡并更改日期,然后返回到“理货”选项卡,则显示中没有任何更改。但是,视图将显示在tally选项卡上,当表在cellFor

我有一个UITableview单元格,它从核心数据数据库中获取计数。tallyTable位于UITab视图内的视图控制器中。我有一个NSLog语句,每当它被更新时,它就会打印出计数值。另一个选项卡有一个列表,用于更改盘点的来源(不同的日期)。我使用的是iOS5,目标是iOS4.2

问题出在这里。当我加载应用程序时,表选项卡中会显示上一个选定日期的正确计数。如果我转到“日期”选项卡并更改日期,然后返回到“理货”选项卡,则显示中没有任何更改。但是,视图将显示在tally选项卡上,当表在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控制器数据。

我将试一试。首先,您使用的是ARC吗?如果没有,则在alloc/init新单元格时需要添加
自动释放
。否则,一切照旧

如果我正确理解了你的问题:

  • tableView在应用程序启动时显示正确的数据

  • 您可以从带有tableView的选项卡切换,并更改tableView数据源

  • 切换回带有tableView的选项卡,您会看到(通过NSLog)表格单元格重新加载了正确的数据,但旧数据仍然在单元格中可见

  • 如果将某个单元格从显示屏上滚动并返回,强制其刷新,则该单元格包含正确的数据

一些想法:

  • 当tableView的视图出现时,它不会自动重新加载自身。每当数据源更改时,您需要调用
    [tableView reloadData]
    。这与当前是否显示tableView无关。我想这一点就能解决你的问题

  • 您不需要在单元格上调用
    setNeedsLayout
    ,除非您希望单元格根据数据重新显示其子视图。您也不需要
    setNeedsDisplay

  • 我假设没有其他复杂因素(例如多个表视图显示相同的数据)会使事情变得混乱


  • 如果使用“准备重用”方法,请记住使用[super prepareforeuse]覆盖原始方法

    如果上述方法不起作用,另一种方法是重新设置单元格,如下所述

    我使用的方法与我在某些集合视图中应用的方法相同:我们应该删除/重置您在其中创建/添加到单元格内容的子视图。这意味着我们需要为每行的每个单元格完全设置数据

    我将代码重置数据值从“准备重用”移动到我设置值的位置,然后简单地工作

    在我的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]; } }
    

    记住也要适当地更改数据源。

    这一切似乎都是正确的。我已经重新加载了数据,正如我所说,传递给label.text的值是正确的,标签在滚动到屏幕上之前不会显示新值。嗯,听起来你的项目有些奇怪。有没有可能您有多个TableView,而您认为正在重新加载的不是正确的TableView?可能会发布更多的代码,如何设置视图以及数据源如何触发表重新加载。花了我很长时间,但您指出的是正确的。“固定页脚”是一个UIView,表部分是一个UITableView,UITableView控制器作为其委托。(我需要一些额外的函数以及我不想要的与表打包在一起的东西)。解决方案是我需要重新加载UITableView和代理UITableViewController.tableView感谢您的锐利目光!很高兴你明白了。我将“修复”您的控制器/视图层次结构,以消除不必要的对象并澄清逻辑。如果没有其他东西,这将清理您的代码并消除不需要的对象。听起来您可能有两个不同的tableView,将tableView委托/数据源设置为非活动视图控制器的控制器有点奇怪。