UITableView在添加数据后停止更新UI而不会崩溃

时间:2013-04-08 10:20:22

标签: ios uitableview

我有一个让我发疯的问题。

我在编辑模式下有一个 始终 的UITableView(必须是)。

用户可以向其添加新行。

tableViewController的navigationItem.leftbarButton推送一个新的控制器来执行它,我们称之为“newRowsVC”。

在推送tableViewController之前将其自身设置为newRowsVC的委托,协议只有一个方法:

-(void) aNewRowHasBeenCreated
{
  [self.tableView reloadData];
}

我开始添加行,一切正常,每个行现在立即显示在tableViewController 中,直到 最后一个新行将强制tableView滚动因为赢了'不再是它的屏幕空间。在这里,我不知道为什么,tableView,只有它,冻结,没有滚动条,不响应输入。应用程序继续运行而不会崩溃,我甚至可以通过点击navigationItem.rightbarButtonItem来关闭tableViewController。

我可以继续创建新行,将它们添加到数组中,正确计算tableView数据源中的行数。但桌子就像死了一样。

如果我解除了tableViewController,然后我回过头来看,我看到之前创建的所有行,也就是那些创建后没有显示的行就在那里!

我真的不知道如何解决这个问题。

我尝试的第一件事是在重新加载表后强制滚动,但它没有修复它。

-(void) aNewRowHasBeenCreated
{
    [self.tableView reloadData];
    [self.tableView setScrollEnabled:YES]; 
}

我也尝试强制tableView滚动到最后一行,但它没有修复它。

-(void) aNewRowHasBeenCreated
{
   [self.tableView reloadData];
   [self.tableView setScrollEnabled: YES];
   [self.tableView scrollToRowAtIndexPosition: [self.tableView indexPathsForVisibleRows]last object] atScrollPosition: UITableViewScrollPositionBottom animated:YES];
}

每次重新加载表时都会检查行数。没有错误,数字是完美的,新的行数据在数组中是正确的,也是未显示的单元格的数据。

我认为可能是因为tableView始终处于编辑模式,所以我尝试将其设置为NO但没有任何变化,我不会解决问题。

两个注释:

1)tableView必须是每个自定义单元格的委托。它们有一个UITextField和一个UIStepper,由tableViewController处理。我已经尝试不将tableViewController设置为其自定义单元格的委托,但没有任何变化,所以问题不是这个。

2)self.tableView.bounces = NO但这与滚动问题无关,滚动已启用。

更新:经过更多测试后,我发现如果我删除了可重复使用的自定义单元格的出列,一切正常,所以问题应该是重用。

static NSString *CellIdentifier=@"MyCell"
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier];

尼古拉

1 个答案:

答案 0 :(得分:0)

几小时后我得到了它。正如Amit所指出的那样,问题隐藏在cellForRowAtIndexPath中...很难捕捉,因为它并没有一直发生,而且我第一次启用/禁用单元重用一切看起来都是一样的所以我没有把问题联系起来它。在我尝试了我能够考虑的所有其他选项之后,我又重新开始了。

问题在于单元格的重用以及自定义单元格将tableView作为其委托处理其textView和步进器而不暴露它们的事实。

我摆脱了所有delagion的东西,并将textView和stepper作为视图的公共属性公开。通过这样做,我能够将tableViewController直接设置为cell.textView的委托,并直接为步进器添加目标/操作。

现在一切都毫无瑕疵。

感谢所有试图帮助我的人!

尼古拉