2017-04-06 52 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報告一個錯誤,儘管它可能不是高優先級,所以誰知道他們是否會/何時會修復它。

相關問題