0

人のリストを含むtableViewがあります。複数のセルを選択したい。選択したセルを保存する辞書を作成しました (スクリーンショット)。

var checkedSubjects: [Person: Bool] = [Person: Bool]()

次に、セルを選択すると、セルの近くにチェックマークが表示され、配列に保存されます(スクリーンショット)。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell: SearchTableViewCell = tableView.dequeueReusableCellWithIdentifier("CELL", forIndexPath: indexPath) as! SearchTableViewCell
    cell.tintColor = UIColor(hex: 0x3f51b5)
    cell.subjectNameLabel.text = subjects[indexPath.row].name
    cell.subjectDescriptionLabel.text = "(\(subjects[indexPath.row].type))"

    let person = Person(id: subjects[indexPath.row].id, name: subjects[indexPath.row].name, type: subjects[indexPath.row].type)
    if checkedSubjects[person] != nil {
        cell.accessoryType = checkedSubjects[person]! ? .Checkmark : .None
    }
    return cell
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.deselectRowAtIndexPath(indexPath, animated: false)
    let index = indexPath.row
    let person = Person(id: subjects[index].id, name: subjects[index].name, type: subjects[index].type)
    if tableView.cellForRowAtIndexPath(indexPath)!.accessoryType == .Checkmark {
        tableView.cellForRowAtIndexPath(indexPath)!.accessoryType = .None
        checkedSubjects[person] = false
        counter--
    } else {
        tableView.cellForRowAtIndexPath(indexPath)!.accessoryType = .Checkmark
        checkedSubjects[person] = true
        counter++
    }
    if counter > 0 {
        saveBtn.enabled = true
        let text = counter == 1 ? "Add \(counter) person" : "Add \(counter) persons"
        saveBtn.setTitle(text, forState: UIControlState.Normal)
    } else {
        saveBtn.enabled = false
        saveBtn.setTitle("Choose persons", forState: UIControlState.Normal)
    }
}

しかし、このセルをもう一度押すと、デフォルトのビューに戻ります。チェックマークは削除されますが、テキストは空白になりません (スクリーンショット)。ラベルの末尾の制約はコンテナー マージンに設定されます。

didSelectRowAtIndexPath で tableViewを試みましたreloadData()が、役に立ちませんでした。

この問題を解決する方法はありますか?

4

1 に答える 1

1

ここでの問題は、実装で物理セルを操作しようとしていることだと思いますdidSelectRow。これは間違ったやり方です。didSelectRow実装でセルのアクセサリ タイプを変更したり、読み取ったりしないでください。代わりに、モデル上で完全に操作し ( checkedSubjects)、影響を受ける行をリロードして、ビューがモデルへの変更を取得するようにします (cellForRowが呼び出されるため)。

于 2015-09-27T17:45:13.993 に答える