我正在创建一个新表,并在其中,我插入一个带有假文本的新行,但我收到了崩溃报告
经过一番摆弄后,我改变了我的代码:由于未捕获的异常而终止应用 'NSInternalInconsistencyException',原因:'尝试插入第5行 进入第0节,但在第0节后只有5行 更新
@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)
}
有人可以向我解释这个开关使代码工作的实际细节吗?
非常感谢〜
答案 0 :(得分:1)
欢迎来到SO。
在第一个版本中,您将一个项目添加到items数组,然后创建一个指向数组计数的indexPath(因此,如果数组包含5个项目,则创建一个indexPath值为row:5,section: 0)
但是,数组是从零开始的。如果数组包含5个元素,则有效数组索引为0 - 4. indexPath值也是如此。最高有效行值为totalRows - 1.如果数组包含5个元素,则5不是有效的数组索引。
在代码的第二个版本中,index =在添加项目之前的项目计数。因此,如果行包含4个项目,count = 4,则添加项目,现在项目包含5个项目,4个是数组中的有效索引,因此插入不会引用超出项目数组末尾的项目
答案 1 :(得分:0)
因为indexPath以0开头,所以它的最大值是items.count - 1
答案 2 :(得分:0)
因为count
从1开始,但是NSIndexPath
以及从0开始的数组索引。
所以假设你有一个(“a”,“b”,“c”)数组,数组计数为3.但它的索引是0,1,2。
所以使用您的第一个代码,您添加新项目并根据其计数超出其数组索引选择索引。例如,在上面的示例数组中添加新项“d”,计数将更改为4.但最大索引为3,这就是它抛出错误的原因。
使用第二个代码,在添加之前首先根据计数得到索引。因此,您将项目d的索引设置为3,因为该数组仅包含a,b,c,然后将d添加到数组。
它现在正在为您工作,但它可能会在您的数组索引和tableView索引之间造成不匹配。
检索对象索引的好方法是使用数组函数indexOf
。