didSelectRowAtIndexPath中的tableViewCell附件类型问题

时间:2015-09-27 16:44:29

标签: ios swift didselectrowatindexpath tableviewcell accessoryview

我有一个包含人员列表的tableView。我想选择多个细胞。我已经创建了一个字典来存储选定的单元格(screenshot)。

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

然后,当我选择一个单元格时,它会在单元格附近显示一个复选标记,并将其保存在我的数组中(screenshot)。

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

但是当我再次按下这个单元格时,我希望它返回到默认视图。它删除了复选标记,但文本不占用空格(screenshot)。标签的尾随约束设置为容器边距。

我在didSelectRowAtIndexPath中尝试过reloadData() tableView,但它没有帮助。

我有什么想法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我认为这里的问题是你试图操纵didSelectRow实现中的物理单元。这是错误的做事方式。请勿在{{1​​}}实施中尝试更改甚至读取单元的附件类型!相反,完全在模型上运行(didSelectRow)并重新加载受影响的行,以便视图获取对模型的更改(因为将调用checkedSubjects)。