2016-03-30 5 views
0

Ich habe einen funktionierenden Schalter und einen Schaltzustand, der verfolgt, welcher Schalter mit der Zeilennummer des Indexpaths und bool, die in einem Wörterbuch gespeichert sind, eingeschaltet wird. Das funktioniert zwar nur für eine Sektion. Ich habe eine schwierige Zeit, das verhindert, dass verschütten zum nächsten Abschnitt über, wie hier zu sehen:Zwei Abschnitte mit einem U-Schalter? - Swift

Section 0 Row 3 switch turned on

Section 1 Row 3 switch turned on without me pressing it.

Gibt es eine Möglichkeit, nur Schalter behält für diesen bestimmten Abschnitt? Im Moment benutze ich zwei Prototyp-Zellen, eine für die Daten, die ich zeige, die nur einen Schalter und die andere Zelle für die Anzeige des Abschnitts-Headers enthält.

Hier einige der Code, den ich zu sehen, wäre hilfreich, erraten, was ich niedergeschlagen:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("advCell", forIndexPath: indexPath) as! advDataCell 

     cell.advDelegate = self 

     switch(indexPath.section) { 
     case 0: 
      cell.lblCategoryItem.text = foodCategories[indexPath.row]["name"] 


     case 1: 
      cell.lblCategoryItem.text = activitiesCategories[indexPath.row]["name"] 

     default: 
      return cell 
     } 


     if advSwitchStates[indexPath.row] != nil { 

      cell.advOnOffSwitch.on = advSwitchStates[indexPath.row]! 
     } 
     else { 
      cell.advOnOffSwitch.on = false 
     } 
     cell.advOnOffSwitch.on = advSwitchStates[indexPath.row] ?? false 

     return cell 
    } 



func switchCell(advSwitchCell: advDataCell,didChangeValue value: Bool) { 
     let indexPath = tableView.indexPathForCell(advSwitchCell)! 

     print("This advanced filter controller has received the switch event.") 
     advSwitchStates[indexPath.row] = value 

    } 

Und was ich bin mit der Schaltzustände speichern:

var advSwitchStates = [Int: Bool]() 
+0

Shop ein Array von NSMutableIndexSets. Der Index für das Array ist die Abschnittsnummer. Wenn ein Schalter eingeschaltet ist, füge die Zeile zum relevanten indexSet hinzu. – Paulw11

Antwort

0

Es gibt zwei verschiedene Ausgaben, bekommen zuerst loswerden die frühen Rückkehr, wenn Sie den Namen der Zelle Einstellung:

switch(indexPath.section) { 
case 0: 
    cell.lblCategoryItem.text = foodCategories[indexPath.row]["name"] 


default: 
    cell.lblCategoryItem.text = activitiesCategories[indexPath.row]["name"] 
} 

Zweitens müssen Sie sowohl mit dem Abschnitt des Toggle-Zustand verfolgen und eine Zeile als Schlüssel, da Sie mehrere Abschnitte haben. Der einfachste Weg, dies zu tun, ist wahrscheinlich, den Schlüssel von advSwitchStates zu einem NSIndexPath zu machen.

z.B. erklären ihn als:

var advSwitchStates = [NSIndexPath: Bool]() 

und dann in cellForRowAtIndexPath

cell.advOnOffSwitch.on = advSwitchStates[indexPath] ?? false 
+0

Ist NSIndexPath der absolute Index der Tabelle? Ich frage, denn sobald es zum nächsten Abschnitt geht, beginnt es wieder bei Null. Ich habe 169 Reihen im ersten Abschnitt. Abschnitt 2 geht zurück auf 1. – Shido

+0

NSIndexPath ist eine Kombination aus Zeile und Abschnitt und wird daher direkt zugeordnet, sofern Sie keine Zeilen in der Benutzeroberfläche hinzufügen oder löschen – litso

1

In Ihrem cellForRowAtIndexPath Sie entziehen eine recycelte Zelle, so wie Sie es tun sollen. Sie müssen jede Ansicht in der Zelle IN ALLEN FÄLLEN vollständig konfigurieren. Das bedeutet, dass Sie in allen Fällen einen Wert für Ihre advOnOffSwitch festlegen müssen.

In Ihrer cellForRowAtIndexPath Methode haben Sie eine switch-Anweisung für Abschnitt Werte von 0, 1 oder einen anderen Wert. Wenn der Abschnittswert nicht 0 oder 1 ist, kehren Sie zurück, ohne den Status der advOnOffSwitch festzulegen. Wenn Sie eine Zelle recyceln, die advOnOffSwitch aktiviert hatte, bleibt sie eingeschaltet, was nicht erwünscht ist. Ändern Sie Ihre switch-Anweisung wie folgt aus:

switch(indexPath.section) { 
    case 0: 
     cell.lblCategoryItem.text = foodCategories[indexPath.row]["name"] 


    case 1: 
     cell.lblCategoryItem.text = activitiesCategories[indexPath.row]["name"] 

    default: 
     cell.advOnOffSwitch.on = false 
     return cell 
    } 

Mit diesem Code können Sie den Schalter in die Stellung für die Abschnitte zu beginnen zwingen andere als Abschnitt 0 oder 1.

+0

Ich habe keine anderen Abschnitte außer 0 und 1. Wenn ich On wähle, sage ich die erste Zeile von Abschnitt 0. Es zeigt auch On von Abschnitt 1 des ersten Reihe. – Shido

Verwandte Themen