插入赝品row@indexPath,iOS



我创建了一个新表,并在其中插入了一个带有伪文本的新行,但我得到了崩溃报告

由于未捕获的异常而终止应用"NSInternalConferenceException",原因:"尝试插入行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)
}       

有人能向我解释一下这个开关使代码工作的实际细节吗?

非常感谢~

欢迎使用SO.

在您的第一个版本中,您将一个项目添加到项目数组中,然后创建一个指向数组计数的indexPath(因此,如果数组包含5个项目,则创建行:5,节:0的indexPath值)

但是,数组是基于零的。如果一个数组包含5个元素,则有效的数组索引为0-4。indexPath值也是如此。最高有效行值为totalRows-1。如果数组包含5个元素,则5不是有效的数组索引。

在代码的第二个版本中,index=添加项目之前的项目计数。因此,如果行包含4个项,count=4,则添加一个项,而现在项包含5个项,并且4是数组的有效索引,因此插入不会引用项数组末尾以外的项。

因为indexPath以0开头,所以它的最大值是items.count-1

因为count是从1开始的,但NSIndexPath和数组索引也是从0开始的。

假设您有一个("a"、"b"、"c")的数组,数组计数为3。但是它的索引是0,1,2。

因此,在第一个代码中,添加新项,并根据超出数组索引的计数选择索引。例如,您将新项"d"添加到上面的示例数组中,则计数将更改为4。但最大索引是3,这就是它抛出错误的原因。

使用第二个代码,在添加之前,首先根据count获取索引。因此,将项d的索引设置为3,因为数组只包含a、b、c,然后将d添加到数组中。

它目前正在为您工作,但它可能会在数组索引和tableView索引之间造成不匹配。

检索对象索引的一个好方法是使用数组函数indexOf

最新更新