2017-09-18 1 views
1

Wenn ich meine Tabellenansicht mit einem searchController neu lade, sehe ich die Benutzer, die ausgewählt sind, weil ich sie in einem Array (utentiSelezionati) hinzugefügt habe und ich habe eine Überprüfung durchgeführt. Aber um sie abzuwählen, muss ich zweimal tippen und ich kann nicht verstehen warum. Es scheint, dass selbst wenn es ausgewählt ist, es die Methode didSelect aufruft.swift: tableview didDeselectRowAt Häkchen

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") 
    } 
} 
+0

Haben Sie 'allowsMultipleSelection' auf' true '? – the4kman

+0

ja ich tat, danke – HaVaNa7

+0

Ich denke, Sie müssen Ihren modifizierten Indexpfad in didDeselectRowAt Methode –

Antwort

1

Wie ich in meinen Kommentar sagte brauchen Sie diese Zeile entfernen tableView.cellForRow(at: indexPath)?.accessoryType = .none von Ihrer didDeselectRowAt Methode und fügen Sie diese eine tableView.reloadRows(at: [indexPath], with: .none) unter print(utente.id! ," rimosso") Linie

vollständigen Code

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

aktualisiert

ändern nativen

den gesamten Code löschen DidSelect und DidDeSelect und fügen Sie diese didSelect Implementierung nur

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") 
    } 
+0

sorry @ReinierMelian, habe ich viele Male überprüft und das Verhalten ist immer noch dasselbe, können Sie mir mehr helfen? – HaVaNa7

+0

Ich fügte print ("etwas") in den Code ein, um sicher zu sein, dass wenn ich die Tabelle neu lade, wenn ich die Zelle zum Deaktivieren, didSelectRowAt wieder aufrufen. Es scheint, dass beim ersten Laden einer Tabelle die erste Methode bei Klick aufgerufen MUSS didSelectRowAt sein – HaVaNa7

+0

@ HaVaNa7 meine Antwort wurde aktualisiert Bitte lassen Sie mich wissen –

0

für diesen Code Versuchen 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") 
    } 
    } 
+0

thnx aber dasselbe Ergebnis ... – HaVaNa7

+0

keine Notwendigkeit der Funktion didDeselect –