2017-02-20 2 views
1

Bitte nimm mich mit, da ich neu bei iOS bin. Ich habe einen TableView, der zwei verschiedene Abschnitte hat, einen für die Einzelauswahl und einen weiteren für die Mehrfachauswahl. Ich habe auch zwei verschiedene benutzerdefinierte Zellen für das selbe gebaut. Ich bin in der Lage, Mehrfachauswahl richtig zu machen, aber nicht die einzelne Auswahl.Swift - Einzel- und Mehrfachauswahl in derselben TabelleView

Ich verwende die Überschreibung setSelected von der Tabelle View Cell für einzelne und mehrere Auswahl.

override func setSelected(_ selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 

     if selected { 
      //make label red 
      } 
     } else { 
      //make label white 
     } 

    } 

jedoch das Problem, das ich bin vor, dass, wenn ich auf multiple Zelle Abschnitt klicken, wird der setSelected ovveride meiner singleSelectionCell aufgerufen wird und es markiert das Etikett weiß. Wenn eine Zelle in singleSelection bereits ausgewählt ist, muss ich sie auf diese Weise beibehalten.

Ich schaute auf diese Antwort, aber ich bin mir nicht sicher, wie das geht. https://stackoverflow.com/a/32857181/4863339

Kann mir bitte jemand helfen, dieses Problem zu beheben?

+0

Ausgewählte Eigenschaft der Zelle funktioniert nicht als Abschnittsauswahl, Sie müssen den Zustand der Auswahl mit 'cellForRowAt' beibehalten. –

+0

Danke antworten. Korrigiere mich, wenn ich falsch liege, aber ich habe versucht, etwas in 'cellForRowAt' zu tun, aber es wird nicht aufgerufen, wenn ich auf Zelle klicke. Könnten Sie bitte mehr darüber erfahren, wie man den Staat retten kann? –

+0

Sie können eine Instanzeigenschaft des Typs 'IndexPath' in Ihrem' ViewController' für den Einzelauswahlbereich und für den Mehrfachauswahlbereich ein Array von 'IndexPath' erstellen und ein Objekt in der' didSelectRowAt' Methode hinzufügen/entfernen. –

Antwort

1

Um zu tun, was Sie wollen, müssen Sie den Zustand der Auswahl Ihrer Zelle zu pflegen, für die einfache Auswahl Abschnitt deklarieren Sie eine Instanz-Eigenschaft des Typs IndexPath? und für multiple Auswahl Abschnitt deklarieren Sie eine Instanz-Eigenschaft des Typs [IndexPath]. Danach vergleichen Sie diese Eigenschaft in cellForRowAt Methode und ändern Sie ihren Wert in didSelectRowAt Methode.

Edit: mit benutzerdefinierten Objekt Sie wie auf diese Weise versuchen, mit Ihrer sectionItem Klasse erstellen eine Eigenschaft selected vom Typ Bool und dass mehrere oder einzelne Element auszuwählen verwenden

SO sollte Ihre Klasse wie folgt aussehen werden .

class Section { 
    var isMultiple: Bool 
    var title: String 
    var items: [Item] 

    init(isMultiple: Bool, title: String, items: [Item]) { 
     self.isMultiple = isMultiple 
     self.title = title 
     self.items = items 
    } 
} 

class Item { 
    var id: Int 
    var name: String 
    //To maintain selected state 
    var selected: Bool = false 

    init(id: Int, name: String) { 
     self.id = id 
     self.name = name 
    } 
} 

Jetzt mit cellForRowAt und didSelectRowAt es geht wie auf diese Weise sollte.

+0

@AbhishekHarsha Erhalten Sie nicht Ihren obigen Kommentar? "Ich sortiere meine Zellen wie folgt"? –

+0

Danke für die Rückkehr! Im Moment habe ich mehrere Abschnitte in meinem TableView, die ich so segregiere. 'return self.sections [section] .sectionItems !.count' Ich kann auch mehrere/Einzelauswahl von Zellen aus der API-Antwort unterscheiden wie so 'lassen section = self.sections [indexPath.section]' 'wenn section.isMultiple { lassen multipleSelectioncell = tableview.cellForRowAt (indexPath) } else { lassen singleSelectionCell = tableview.cellForRowAt (indexPath) } ' jetzt wie würde ich den Überblick über ausgewählte Zeilen und nicht ausgewählten Zeilen für einzelne Auswahl in' didSelectRow'? –

+0

Vergleichst du String? Ist 'sectionItems' ein Array von String? –

Verwandte Themen