indexPath 的索引超出范围 swift

Index out of range for indexPath swift

我正在制作一个应用程序,要求用户点击多个单元格才能 select 它们。当他们点击一个单元格时,将出现一个 .Checkmark 配件。出于某种原因,尽管每当我尝试到达 VC 应用程序崩溃时,我都会在第 8 行收到以下错误消息(if !checked[indexPath.row]):

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
            }
        }
    }

您的问题是当调用 tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 时,您仅 store 项在 checked 数组中。但是,只有当您实际 select 一行时才会调用该方法。

另一方面,

tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) 每次需要渲染新的 table 单元格时都会被调用。

所以当你在 cellForRowAtIndexPath 中问:

if !checked[indexPath.row]

那么你不能确定 checked 是否真的包含任何东西。例如,当您第一次开始渲染您的单元格时,您的 checked 数组不包含任何值,因此当您在它没有值的位置上请求它的值时它会崩溃。

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

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

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

checked = Array(count:recipies.count, repeatedValue:false)

这样你就可以确定你检查的数组被正确初始化了,元素数量与你接收到的元素数量相同。

另一种选择是让 recipies 中的各个元素知道它们是否被选中。

希望这对您有所帮助。