0

I am making an app that requires the user to tap on multiple cells in order to select them. when they tap on a cell, a .Checkmark accessory item will appear. For some reason though whenever I try and get to that VC the app crashes and I get the following error messages on line 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
    }

and this is my working checked method:

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

1 回答 1

3

您的问题是您仅在调用时将项目存储checked数组 tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)中。但是,仅当您实际选择一行时才会调用该方法。

tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)另一方面,每次你需要渲染一个新的表格单元格时都会调用它。

所以当你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知道它们是否被检查。

希望这是有道理的,可以帮助你。

于 2016-07-08T13:22:23.170 回答