Swift didDeselectRowAtIndexPath无法处理预设单元格

时间:2016-01-31 02:24:55

标签: swift

我有一张表,用于显示时区选项。我使用复选标记来显示当前选择的那个。创建表格后,我选中保存为用户时区的单元格。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cellData")

        switch indexPath.row {
            case 0: cell.textLabel?.text = "Eastern"
            case 1: cell.textLabel?.text = "Central"
            case 2: cell.textLabel?.text = "Mountain"
            case 3: cell.textLabel?.text = "Mountain (No DST)"
            case 4: cell.textLabel?.text = "Pacific"
            default: cell.textLabel?.text = ""
        }

        cell.selectionStyle = UITableViewCellSelectionStyle.None

        if(cell.textLabel?.text == keychain.get("timezone")) {

            cell.accessoryType = UITableViewCellAccessoryType.Checkmark

        }

        return cell
    }

然后,当用户选择新时区时,我会使用这些功能更改复选标记。

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    tableView.cellForRowAtIndexPath(indexPath)!.accessoryType = UITableViewCellAccessoryType.Checkmark

}

override func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {

    tableView.cellForRowAtIndexPath(indexPath)!.accessoryType = UITableViewCellAccessoryType.None

}

但是,当我预设复选标记时,我选择新时区时不会删除它。它只有在我第一次选择它然后选择一个新的时才会起作用。是否有原因取消选择原始单元格?

1 个答案:

答案 0 :(得分:1)

原始单元格未被取消选择的原因是它首先未被选中。启用复选标记附件不会选择单元格。

设置起来有点痛苦,但是你可以通过存储对需要选择的单元格的引用来实现这一点,并且当视图出现时,手动选择它。 。然后,取消选择将起作用。

添加一个类变量以记住应该选择的单元格

var initiallySelectedPath: NSIndexPath?

cellForRowAtIndexPath中设置变量(个人而言,由于将如何执行实际的单元格选择,我会在课程的其他位置执行此设置,但这足以证明一个解决方案。

...
if (cell.textLabel?.text == keychain.get("timezone")) {
  cell.accessoryType = UITableViewCellAccessoryType.Checkmark
  initiallySelectedPath = indexPath
}
...

然后,在viewWillAppear

override func viewWillAppear(animated: Bool) {
  super.viewWillAppear(animated)
  if let indexPath = initiallySelectedPath {
    // I force unwrap (sorry!) my tableView, you'll need to change this to however you reference yours
    tableView!.selectRowAtIndexPath(indexPath, animated: false, scrollPosition: UITableViewScrollPosition.None)
  }
}

现在您的原始单元格应该在第一次点击其他单元格时取消选择。