UITableView endUpdates 在 vi​​ewDidLoad 中调用时崩溃

Posted

技术标签:

【中文标题】UITableView endUpdates 在 vi​​ewDidLoad 中调用时崩溃【英文标题】:UITableView endUpdates crash when called in viewDidLoad 【发布时间】:2012-10-11 11:33:36 【问题描述】:

我有一个 UITableView,我想在我的视图控制器的 viewDidLoad 中修改它。 但是 UITableView 不会在 viewDidLoad 中查询它的数据源,所以我先调用 reloadData,然后用 beginUpdates 和 endUpdates 修改它的单元格。 (就我而言,我只是删除了一些单元格)。 但是当 endUpdates 被调用时,它会抛出一个异常:

[__NSArrayM insertObject:atIndex:]: 空数组的索引 1 超出范围。

这个异常是什么意思? 我知道我正在向 UITableView 返回正确的数字,因为如果我在 viewDidAppear 之后调用它,它可以完美运行,它只是在 viewDidLoad 中不起作用。

编辑:

这是我的代码

for (int i = 0; i < [customDataSource numberOfSectionsInTableView]; i ++) 
    NSInteger n = [customDataSource tableView:self numberOfRowsInSection:section];
    NSMutableArray* array = [[NSMutableArray alloc] initWithCapacity:n];
    for (NSInteger i = 0; i < n; i++)
        [array addObject:[NSIndexPath indexPathForRow:i inSection:section]];
    [super beginUpdates];
    [super deleteRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationNone];
    [super endUpdates];

当我将此代码从 viewDidAppear 移动到 viewDidLoad 或 viewWillAppear 时,它会崩溃。

【问题讨论】:

您是在调用开始/结束更新之前还是之后设置阵列? 我正在我的 appDelegate 的 applicationDidFinishedLaunchingWithOptions: 中设置我的数组,这当然是在调用 viewDidLoad 之前。 请编辑您的帖子以显示您的 viewDidLoad。 在我的 viewDidLoad 中没有任何东西会告诉你这个错误是如何发生的。我开发了一个从 UITableView 继承的自定义 tableview,我在我的视图控制器中使用这个自定义 tableview。然后我必须在这里发布十几个千字节的代码,但我不能。你到底想知道什么信息? 这一切似乎没有多大意义。它是视图类中的控制器代码,开始/结束更新应该包含整个块,然后为什么要删除视图上尚未显示的任何内容? 【参考方案1】:

看起来您正试图将索引 1 处的对象插入空数组。如果数组为空,则唯一可接受的插入索引是 0。检查如何计算索引值。

【讨论】:

以上是关于UITableView endUpdates 在 vi​​ewDidLoad 中调用时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 意外反弹 beginUpdates()/endUpdates()/performBatchUpdates()

endUpdates 后的 UITableView 部分页脚视图位置

UITableView beginUpdates/endUpdates 同时滚动使滚动跳转

执行“beginUpdates”“endUpdates”时 UITableView 页脚视图的动画问题

UITableView endUpdates 在 vi​​ewDidLoad 中调用时崩溃

beginUpdates和endUpdates 实现UITableView的动画块