我已经和tableView deleteRowsAtIndexPaths
UITableView
一起战斗了一个星期了,而且我非常绝望......
我有两个ViewControllers,在第一个用户中选择UIPickerView
中的几个数字,每次按下一个按钮,选择器视图中选择的值将插入NSMutableArray
的索引0这是自定义对象的属性。
此自定义对象在NSUserDefaults
中保存(编码)并通过segue传递到第二个ViewController。
在第二个ViewController中,我有一个UITableView
;第二个ViewController既是tableview的数据源又是委托。
我成功加载了tableview中NSMutableArray
的所有值。
"添加/保存/恢复已保存的"操作:用户可以在第一个ViewController中添加一个或多个值,它们被正确保存到NSUserDefaults
,传递到segue中的第二个ViewController,加载到tableview的单元格中。如果我退出应用程序并再次启动它,一切都在ViewControllers中按预期工作。
当用户想要删除第二个ViewController的tableview中的行时,我的问题就开始了;这样做显然会更新第一个ViewController中的自定义对象,从可变数组中删除相应的对象。
我实际上可以这样做,但仅适用于tableview的前7/8行:当我尝试删除列表中较低的行时(让我们说15日,20日)我收到如下错误消息:
由于未捕获的异常终止应用' NSRangeException',原因: ' * - [__ NSArrayM objectAtIndex:]:索引10超出界限[0 .. 9]'
问题在于,如果我追踪数组的值和数量(我上周可能已经编写了一个thounsand NSLogs),我绝不会超出范围"。
虽然我不想用我的所有代码来打扰社区,但也许对我的应用程序中的方法有所了解对于我必须犯的错误的建议有用...
在第二个ViewController中:
number of rows in tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
是可变数组的计数(self.myObject.myMutableArray.count);
tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
中的(可重用)单元格是数组indexPath.row中对象的新实例化:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
CustomObject * currentObject = [self.myObject.myMutableArray objectAtIndex:indexPath.row];
我将“是”返回tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
。
tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
的代码,我认为是我的问题(我得到的最后一个NSLog是在这个方法中),是:
[self.delegate deleteInMutableArrayOfFirstViewControllerFromTableViewInSecondViewControllerAt:indexPath];
// the first ViewController is the delegate of the second
[tableView beginUpdates];
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView endUpdates];
在第一个ViewController中:
我实现了我的委托方法deleteInMutableArrayOfFirstViewControllerFromTableViewInSecondViewControllerAt:
//I do a few other things, but the important part should be the removal of the object from
//the array, the passing of the modified object to the second ViewController and the save of
//the data to NSUserDefault using a custom method which I don't write here because it's
//pretty straightforward...
[self.myObject.myMutableArray removeObjectAtIndex:indexPath.row];
[_secondViewController setMyObject:self.myObject];
[self saveToUserDefaults:self.myObject];
我希望上面的代码足以让我们了解问题。
我应该指出,我还尝试在[self.delegate deleteInMutableArrayOfFirstViewControllerFromTableViewInSecondViewControllerAt:indexPath]
之后或[tableView beginUpdates]
之后调用[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]
,但它并没有解决问题。
如果我理解正确,在删除tableview中的行时我应该
按此顺序......我想我就是这样做的。
我知道我可以尝试将对数组所做的每一项更改保存到NSUserDefaults
并在两个ViewControllers中保存/加载对象,但这看起来并不优雅,这也会迫使我重写我的代码的一致部分(因为这第二个视图不仅包含tableview,而且还包含UIScrollView的容器,其中我加载了4个子视图控制器,每个视图控制器加载来自第二个视图控制器的数据...那部分现在正在运作我讨厌冒险破坏它。)
我还考虑过问题是重用细胞的可能性,但没有用dequeueReusableCellWithIdentifier
实例化细胞并没有改变我得到的奇怪行为。
正如我所说,我NSLog了值(特别是两个ViewControllers中NSMutableArray中对象的数量),我似乎总是"在界限内#34;。
任何人都有我的建议吗?
请注意,当我删除行时,我不会总是收到错误,只有在删除第一个7/8下的行时才会发生崩溃。
提前致谢!
@ cdf1982
答案 0 :(得分:0)
原来,我要感谢@HotLicks指出我正确的方向,我没有更新我在tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
内使用的另一个数组
由于添加了异常断点(在Breakpoint Navigator的左下角按+,⌘7),我抓住了我的错误:它向我展示了所有与代码“对齐”的异常,因此我的愚蠢错误立刻出现了。