不寻常的UITableView崩溃 - [__ NSArrayM objectAtIndex:]:索引0超出空数组的界限

时间:2017-04-06 04:40:52

标签: ios swift uitableview

我搜索了很多,但没有找到答案似乎解决了我遇到的问题。

我有一个UITableViewController。在viewDidLoad方法中,我从数据库加载对象,然后调用reloadData。

现在一般来说这很好用。但是,现在我正在实现排序,这是持久的,以便在下一个应用程序启动时使用相同的排序算法。请注意,在所有情况下,支持该部分的阵列的大小在排序后是相同的。

如果我使用默认的排序方法,即使它运行相同的排序>我也不会崩溃。呼叫代表> reloadTable代码路径。但是,如果我使用一个使用相同代码路径的备用排序方法,我会看到表视图询问行数,并获得正确的数字,但后来我得到了这个异常。只有对象按照不同的顺序排序,所以这对我没有意义。

另外需要注意的是,如果在显示表格后对对象(使用相同的代码路径)进行排序,则可以正常工作。

这对我来说没什么意义,而且几乎看起来像是一个UITableView错误,但我希望这是我能解决的问题。

我的应用是开源的,所以我可以直接链接到相关文件:

https://github.com/einsteinx2/iSub/blob/weird_crash/Classes/UI/Reusable/ItemViewController.swift https://github.com/einsteinx2/iSub/blob/weird_crash/Classes/UI/Reusable/ItemViewModel.swift

最相关的方法是ItemViewModel.sortAll()ItemViewController.itemsChanged(viewModel: ItemViewModel)

我已经完成了如何调试它的想法。这没有任何意义。

我尝试过的一些反复试验:

  1. 仅使用一个表格部分
  2. 延迟后调用reloadData以排除某种竞争条件
  3. 不在我的itemsChanged委托方法中调用reloadData(仍然崩溃,因为reloadData似乎是由表视图控制器自动调用的)
  4. 似乎没有任何区别。我完全不知道这是怎么可能的。如果有人对我如何继续调试这个问题有任何想法,或者它是如何可能的话,我会全力以赴。感谢。

    编辑:为了让事情更加混乱,我同样坚持对相册进行排序,这些相册使用相同的ItemViewController,但是返回到之前排序的相册不会导致崩溃,即使它应该做同样的事情并运行相同的代码路径。

1 个答案:

答案 0 :(得分:0)

哇,我终于明白了,谈论边缘情况!

事实证明崩溃与表格部分索引(右侧的字母)有关,而不是实际的数据加载或排序。

我没有按名称排序时使用unicode项目符号。不知怎的,这在你实时排序时有效,但是当你用这些数据加载表时,UITableView中有一些错误会导致部分索引的内部数组为空。我转而使用黑色圆圈字符,现在它不再崩溃了。

我认为这是我8年来为iOS编写的大量调查工作中最小的变化。

希望这有助于将来一些随机的人。我会向Apple报告一个错误,但可能不会高优先级,所以谁知道他们是否/何时会修复它。