2015-12-04 44 views
0

林創建新表,並在其中,林插入新行用假的文字,但我得到的崩潰報告插入假行@ indexPath,iOS版

終止應用程序由於未捕獲的異常 「 NSInternalInconsistencyException「理由是:」試圖插入一行5 成段0,但 更新

經過一番摸索之後,現在只有5節0行,我改變了我的代碼:

@IBAction func add() { 
    let newRow = ChecklistItems(text: "Im the new Row", checked: false) 
    items.append(newRow) 
    let index = items.count 
    let indexPath = NSIndexPath(forRow: index, inSection: 0) 
    tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Left) 
} 

這樣:

@IBAction func add() { 
    let index = items.count 
    let newRow = ChecklistItems(text: "Im the new Row", checked: false) 
    items.append(newRow) 
    let indexPath = NSIndexPath(forRow: index, inSection: 0) 
    tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Left) 
}  

有人可以給我解釋一下實際的細節,爲什麼這個開關使代碼工作?

太感謝你了〜

回答

1

歡迎SO。

在您的第一個版本中,您將項目添加到項目數組,然後創建一個indexPath指向數組的計數(因此,如果數組包含5個項目,則創建一個indexPath值爲5,section :0)

然而,陣列是基於零的。如果數組包含5個元素,則有效數組索引爲0 - 4。對於indexPath值也是如此。最高有效行值爲totalRows - 1.如果數組包含5個元素,則5不是有效的數組索引。

在代碼中,指數的第二個版本=物品計數之前添加的項目。因此,如果行包含4個項目,count = 4,則添加項目,現在項目包含5個項目,並且4是數組中的有效索引,因此插入操作不會引用超出項目數組末尾的項目。

+0

真棒!謝謝你親切的先生 – Tom

0

因爲indexPath是從0開始,所以它的最大值是items.count - 1

0

由於count是從1開始,但NSIndexPath並且還數組索引從0開始

所以可以說你具有的(「A」,「B」,「C」)的陣列,陣列計數是3.但它的指數是0,1,2

所以你的第一個代碼,添加新項目,並選擇基於其計數是超出了數組索引的索引。例如你在上面的例子數組中添加新的項目「d」,計數將被改爲4.但是最大索引是3,這就是它拋出錯誤的原因。

與你的第二個代碼,你先加入之前獲得基於數量的指標。所以你用3設置項目d的索引,因爲該數組只包含a,b,c,然後將d添加到數組中。

它是爲你工作的權利,但它可能會創建數組索引和你的tableView指數之間的不匹配。

的一個好方法,以檢索對象的索引是使用陣列功能indexOf

+0

謝謝你的解釋,這段代碼背後的邏輯絕對有更多的意義,謝謝你們 – Tom