0

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

我有一个始终处于编辑模式的 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,但没有任何变化,id 无法解决问题。

两个注意事项:

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

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

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

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

尼古拉

4

1 回答 1

0

几个小时后,我得到了它。正如 Amit 所指出的,问题隐藏在 cellForRowAtIndexPath 中......很难捕捉到,因为它并没有一直发生,而且我第一次启用/禁用单元重用一切似乎都是一样的,所以我没有链接问题给它。在尝试了我能想到的所有其他选项后,我重新开始了它。

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

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

现在一切都完美无缺。

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

尼古拉

于 2013-04-08T13:49:29.313 回答