0

ユーザーが複数のセルをタップして選択する必要があるアプリを作成しています。セルをタップすると、.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
            }
        }
    }
4

1 に答える 1

3

問題は、が呼び出されたときにのみ配列に アイテムを格納することです。ただし、そのメソッドは、実際に行を選択したときにのみ呼び出されます。checkedtableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)

tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)一方、新しいテーブル セルをレンダリングする必要があるたびに呼び出されます。

だからあなたがcellForRowAtIndexPath尋ねるとき:

if !checked[indexPath.row]

checkedその場合、実際に何かが含まれているかどうかを確認できません。たとえば、セルのレンダリングを初めて開始するとき、checked配列には値が含まれていないため、値がない位置に値を要求すると配列がクラッシュします。

1 つの解決策は、すべての値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 に答える