如何通过点击来选择和取消选择行

时间:2017-03-21 16:14:31

标签: ios swift xcode uitableview cell

我有一个带有UITableViewCell的UITableView,我想通过点击它来选择它们,然后再通过点击它们取消选择它们。 首先,我尝试了

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        // code
}

但是我注意到当你在一个单元格上第二次点击时,这个功能不会被执行;单击另一个单元格时会执行此操作。 但是我希望您可以点击几个单击它们时单击它们的单元格。

所以我制作了这段代码(简化):

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("Selected")
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! LektionTableViewCell
        if cell.accessoryType == .none {
            print("Type = none")
            cell.accessoryType = .checkmark
            Lektion.insert(Dateien[indexPath.row], at: Lektion.count)
        } else if cell.accessoryType == .checkmark {
            print("Type = check")
            cell.accessoryType = .none
            Lektion.remove(at: indexPath.row)
        }
    }

但它无法正常工作:

  1. 当我点击一个单元格时,文本会自动转到"标签" (它在视图构建器中的文本)
  2. 当我点击带有支票的单元格时,支票不会消失,Xcode会说" Type = none&#34 ;;那是错的。
  3. 有人能帮助我吗?

2 个答案:

答案 0 :(得分:0)

didSelect方法中删除以下代码,因为dequeReusableCell不应在cellForRowAtIndexPath之外使用。

let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! LektionTableViewCell
        if cell.accessoryType == .none {
            print("Type = none")
            cell.accessoryType = .checkmark
            Lektion.insert(Dateien[indexPath.row], at: Lektion.count)
        } else if cell.accessoryType == .checkmark {
            print("Type = check")
            cell.accessoryType = .none
            Lektion.remove(at: indexPath.row)
        }

您可以使用cellForRowAtIndexPath

中的idSelectRow获取单元格实例
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    if let cell = tableView.cellForRow(at: IndexPath) as? LektionTableViewCell {
        // Perform your operations here.....
    }

}

现在,您的查询解决方案,单击时不会调用didSelect的解决方案(除非您选择另一行)。 允许对表格视图进行多项选择

注意:在表数组中使用flag(boolean)变量来设置表加载数据时的选择状态。

答案 1 :(得分:0)

我无法评论,所以我在这里添加。 从您的代码中我们不知道您存储数据的位置以填充您的单元格。所以我不知道这是否可以帮助你,但假设你有一个包含你的对象的数组,一种方法是设置一个" isSelected"对didSelectRowAt indexPath方法上的对象变量,然后调用tableview.reloadData()。像这样:

     func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            myObjects[indexPath.row].isSelected = !myObjects[indexPath.row].isSelected 
            tableView.reloadData() 
      }

然后在cellForRowAtIndexPath方法中,当您创建单元格时,您可以轻松地将accessoryType设置为.checkmark或.none,具体取决于对象的标记。 像这样:

cell.accessoryType = myObjects[indexPath.row].isSelected ? .checkMark : .none

希望有所帮助。