indexPath swift的范围超出范围

时间:2016-07-08 12:51:08

标签: swift uitableview swift2 nsindexpath exc-bad-instruction

我正在创建一个应用程序,要求用户点击多个单元格以便选择它们。当他们点击一个单元格时,会出现一个.Checkmark附件项目。出于某种原因,虽然每当我尝试进入该VC时,应用程序崩溃,我在第8行收到以下错误消息(if!checked [indexPath.row]):Bad Instruction error

Index out of range

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {
        let cell: InstrumentTableCell! = tableView.dequeueReusableCellWithIdentifier(identifier) as? InstrumentTableCell


        cell.configurateTheCell(recipies[indexPath.row])

        if !checked[indexPath.row] {
            cell.accessoryType = .None
        } else if checked[indexPath.row] {
            cell.accessoryType = .Checkmark
        }
        return cell
    }

这是我的工作检查方法:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
    {
        tableView.deselectRowAtIndexPath(indexPath, animated: true)
        if let cell = tableView.cellForRowAtIndexPath(indexPath) {
            if cell.accessoryType == .Checkmark {
                cell.accessoryType = .None
                checked[indexPath.row] = false
            } else {
                cell.accessoryType = .Checkmark
                checked[indexPath.row] = true
            }
        }
    }

1 个答案:

答案 0 :(得分:3)

您的问题是,在调用checked时,您只在<{1}}数组中存储项目。但是,只有在实际选择行时才会调用该方法。

另一方面,每次需要渲染新的表格单元时,都会调用

tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)

所以,当你在tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)问:

cellForRowAtIndexPath

然后你不能确定if !checked[indexPath.row] 实际上包含任何东西。例如,第一次开始渲染单元格时,checked数组不包含任何值,因此当您要求某个位置上的值没有值时,它会崩溃。

一种解决方案可能是初始化您的checked数组以包含所有checked值。我猜你有一些名为false的模型数组,所以你可以这样做:

recipies

或者正如@AaronBrager在下面的评论中所建议的那样(这样更漂亮:))

for (index, _) in recipies.enumerate() {
    checked.append(false)
}

通过这种方式,您可以确保已使用与收件人相同数量的元素正确初始化已检查的数组。

另一种选择可能是让checked = Array(count:recipies.count, repeatedValue:false) 中的各个元素知道它们是否被检查。

希望这有意义并帮助你。