我创建了一个新表,并在其中插入了一个带有伪文本的新行,但我得到了崩溃报告
由于未捕获的异常而终止应用"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
。