2017-04-06 50 views
3

我搜索了一吨,并没有找到似乎解决我遇到的问题的答案。不寻常的UITableView崩溃 - [__ NSArrayM objectAtIndex:]:索引0超出空阵列的边界

我有一个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. 不调用reloadData在我itemsChanged委托方法(仍然崩溃,因为reloadData似乎被表视图控制器自动调用)

似乎没有什么区别。我完全困惑这是怎么可能的。如果有人对我如何继续调试这个问题有任何想法,或者有可能的话,我会全神贯注。谢谢。

编辑:为了使事情更令人困惑,我也类似地坚持排序相册,使用相同的ItemViewController,但返回到以前排序的专辑不会导致崩溃,即使它应该做的完全相同并且运行相同的代码路径。

+0

您在项目中遵循什么架构? :? –

+1

如果我能正确理解你的问题,那是MVVM,但没有绑定。 –

回答

0

哇,我终于想通了,谈论边缘情况!

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

当未按名称排序时,我使用的是unicode bullet字符。不知怎么的,当你对实时进行排序时,这有效,但是当你用这些数据加载表时,UITableView中存在一些错误,导致段索引的内部数组为空。我切换到使用黑色圆圈字符,现在它不再崩溃。

我认为这应该是我在8年的iOS编码工作中进行的最多调查工作的最小变化。

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

相关问题