swift:tableview didDeselectRowAt勾选标记

时间:2017-09-18 14:27:05

标签: ios swift tableview

当我使用searchController重新加载我的tableview时,我正确地看到那些被选中的用户,因为我将它们添加到数组中(utentiSelezionati)并且我执行了检查。但要取消选择它们,我必须点击两次,我无法理解为什么。似乎即使它被选中,也会调用didSelect方法。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier:      "UserTableViewCell", for: indexPath)

    cell.accessoryType = cell.isSelected ? .checkmark : .none
    cell.selectionStyle = .none // to prevent cells from being "highlighted"

    if let c = cell as? UserTableViewCell {
        let utente = self.utenti[indexPath.row]

        c.textLabel?.text = utente.name
        c.detailTextLabel?.text = utente.email

        if utentiSelezionati.contains(where: {$0.id == utente.id}){
            cell.accessoryType = cell.isSelected ? .checkmark : .checkmark
        }
    }

    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let utente = self.utenti[indexPath.row]

    tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark

    if !self.utentiSelezionati.contains(where: {$0.id == utente.id}){
        self.utentiSelezionati.append(utente)
  print("premuto aggiungi") 
    }
  print("something") 
}
}

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    tableView.cellForRow(at: indexPath)?.accessoryType = .none

    let utente = self.utenti[indexPath.row]

    print("premuto rimuovi")

    if let index:Int = self.utentiSelezionati.index(where: {$0.id == utente.id}) {
        self.utentiSelezionati.remove(at: index)

        print(utente.id! ," rimosso")
    }
}

2 个答案:

答案 0 :(得分:1)

正如我在评论中所说,您需要从tableView.cellForRow(at: indexPath)?.accessoryType = .none方法中删除此行didDeselectRowAt,并在tableView.reloadRows(at: [indexPath], with: .none)

下面添加print(utente.id! ," rimosso")

完整代码

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    let utente = self.utenti[indexPath.row]

    print("premuto rimuovi")

    if let index:Int = self.utentiSelezionati.index(where: {$0.id == utente.id}) {
        self.utentiSelezionati.remove(at: index)

        print(utente.id! ," rimosso")
        tableView.reloadRows(at: [indexPath], with: .none)
    }
}

更新

替代

从DidSelect和DidDeSelect中删除所有代码,并仅添加此didSelect实现

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let utente = self.utenti[indexPath.row]

        if !self.utentiSelezionati.contains(where: {$0.id == utente.id}){
            self.utentiSelezionati.append(utente)
            print("premuto aggiungi")
        }else{
            if let index:Int = self.utentiSelezionati.index(where: {$0.id == utente.id}) {
                self.utentiSelezionati.remove(at: index)

                print(utente.id! ," rimosso")
            }
        }
        tableView.reloadRows(at: [indexPath], with: .none)
        print("something") 
    }

答案 1 :(得分:0)

尝试 Swift 3

的此代码
func tableView(_ tableView: UITableView, didSelectRowAt indexPath:      IndexPath) 
  {
    if (tableView.cellForRow(at: indexPath)?.accessoryType == UITableViewCellAccessoryType.checkmark)
    {
      //For removing check mark     
      tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.none

      let utente = self.utenti[indexPath.row]
      print("premuto rimuovi")
      if let index:Int = self.utentiSelezionati.index(where: {$0.id == utente.id}) 
      {
        self.utentiSelezionati.remove(at: index)
        print(utente.id! ," rimosso")
      }
    }
    else 
    {
      // For adding checkMark
      tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.checkmark

      let utente = self.utenti[indexPath.row]
      if !self.utentiSelezionati.contains(where: {$0.id == utente.id})
      {
      self.utentiSelezionati.append(utente)
      print("premuto aggiungi") 
      }
    print("something") 
    }
  }