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

问题描述:

我有一个令我发疯的问题。UITableView在添加数据后不会崩溃更新UI

我有一个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 *[email protected]"MyCell" 
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; 

尼古拉

+0

just set [self.tableView setScrollEnabled:YES];为UITableview后重新加载它将工作 – krishh 2013-04-08 10:42:39

+0

这是我第一次尝试,但它不能解决它。 – 2013-04-08 10:45:23

+1

很高兴看到更多的UITableView代码(比如'cellForRow ...')这个问题可能出现在其中一种方法中。 – 2013-04-08 11:15:55

小时后我得到了它。正如Amit所指出的那样,这个问题隐藏在cellForRowAtIndexPath中......这很难被捕获,因为它并没有发生,我第一次启用/禁用单元格重用所有内容似乎都是一样的,所以我没有链接问题到它。在我尝试了所有其他我可以考虑的选项后,我就回过头来了。

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

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

现在一切都无故障运作。

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

Nicola