插入假行@ indexPath,iOS

时间:2015-12-04 02:08:58

标签: ios arrays swift uitableview

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

  

由于未捕获的异常而终止应用   '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)
}       

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

非常感谢〜

3 个答案:

答案 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