我对 iOS 开发很陌生,尝试一些应该很容易的事情让我度过了一段糟糕的时光;每次用户单击现有行之一时,在 TableView 中添加额外的行。该操作没有真正的目的,我只是想了解 TableView 的行为。
所以我做了以下事情:
我使用了基于拆分视图的模板,并将 RootViewController 中的行数更改为 30。
- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
return 30;
}
方法 tableView:didSelectRowAtIndexPath 看起来如下:
- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
/*
When a row is selected, set the detail view controller's detail item to the item associated with the selected row.
*/
NSMutableArray* paths = [[NSMutableArray alloc] init];
NSIndexPath *indice = [NSIndexPath indexPathForRow:30 inSection:0];
[paths addObject:indice];
detailViewController.detailItem = [NSString stringWithFormat:@"Second Story Element %d with all its information and bla bla bla", indexPath.row];
[[self tableView] beginUpdates];
[self.tableView insertRowsAtIndexPaths:(NSArray *) paths withRowAnimation:UITableViewRowAnimationNone];
[[self tableView] endUpdates];
}
当我执行程序并单击其中一个元素时,我收到以下错误:
*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:第 0 节中的行数无效。更新后现有节中包含的行数 (30) 必须等于行数更新前包含在该节中 (30),加上或减去从该节插入或删除的行数(插入 1,删除 0)。
我没有更改模板提供的代码的任何其他部分。
我非常广泛地阅读了 Apple 的文档以及对以下问题的回答: 在 iphone 的 TableView 中动态添加一行 以及 如何正确使用 insertRowsAtIndexPaths?
第二个问题似乎解决了同样的问题,但我无法理解发生了什么。它们对数据源意味着什么?我更好理解的回应如下:
这是一个两步过程:首先更新您的数据源,以便 numberOfRowsInSection 和 cellForRowAtIndexPath 将为您的插入后数据返回正确的值。您必须在插入或删除行之前执行此操作,否则您将看到“无效的行数”错误。
数据源的这种更新意味着什么?
示例代码将不胜感激,因为我非常沮丧。
顺便说一句,我正在尝试的所有内容都与进入编辑模式无关,不是吗?