2017-08-24 1 views
1

Mein Tableview sieht wie folgt ausUISwitch verändert Zustand auf andere Zelle, wenn Scroll

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! Cell 
    return cell 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 200 
} 

Und mein tableviewcell sieht wie folgt aus

class Cell: UITableViewCell { 

override func awakeFromNib() { 
    super.awakeFromNib() 
    // Initialization code 
} 

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

    // Configure the view for the selected state 
} 

} 

Wenn ich Schaltzustand auf jeder Zelle und blättern ändern. Der Schalter für eine andere Zelle hat den Zustand für andere Zellen beim Scrollen periodisch geändert. Bitte helfen

layout of uiswitch

+0

Es ist wegen der Zelle aus der Warteschlange. Können Sie Ihre Frage bitte mit Datenmodellen aktualisieren? – Baig

+0

Das ist das Problem. Ich habe ein Testprojekt erstellt, um zu sehen, ob mein Datenmodell dieses Problem verursacht. Aber mit nur diesem Code es gibt ich gleiches Problem – cole

+0

Bitte überprüfen Sie meine aktualisiert [Antwort] (https://stackoverflow.com/a/45857034/1556386) – Baig

Antwort

4

Sie muß Datenarray mit Zustand hat für jeden Schalter und in Ihren didSelect Methodenmodelländerungsdaten für Schalter dann in cellForRow bei get Schaltzustand von Array und Ihren Viewcontroller müssen SwitchControlDelegate seine

class UIViewController:SwitchControlDelegate{ 

    var array = [Bool](count: 200, repeatedValue:false) 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! Cell 
    cell.switchControl.isOn = array[indexPath.row] 
    cell.switchDelegate = self 
    cell.index = indexPath.row 
    return cell 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 200 
} 

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

func switchChangeStateWithIndex(index:Int){ 
    array[index] = !array[index] 
} 

Dieser Schaltzustand ändern, wenn Sie auf Zelle klicken, wenn Sie Zustand ändern müssen, wenn eine Änderung Schaltersteuerung Sie delegieren benötigen, um Datenmodell zu aktualisieren in Viewcontroller

in Ihrer Zelle Datei:

protocol SwitchControlDelegate: class { 
     func switchChangeStateWithIndex(index:Int) 
    } 

    class Cell: UITableViewCell { 

     var index:Int = 0 
     weak var switchDelegate: SwitchControlDelegate? 
     override func awakeFromNib() { 
      super.awakeFromNib() 
      // Initialization code 
     } 

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

      // Configure the view for the selected state 
     } 

     @IBAction func valueChanged(_ sender: AnyObject) { 
      switchDelegate?.switchChangeStateWithIndex(index:index) 
     } 

} 

Sie benötigen Aktion Wertänderung von Ihrer Schaltersteuerung mit dieser Funktion valuechanged, so jedes Mal anpassen, wenn Sie Schaltzustand Zelle Bedarf ändern

Es
+0

Hallo Svetoslav, ich habe das gleiche Problem mit Ihrem Code. Wenn ich scrolle, ändert sich die ausgewählte Zeile, deren Schalter gewechselt wird. Geht zurück in den nicht ausgewählten Zustand. – cole

+0

Bitte meine aktualisierten Code sehen und wenn Sie immer noch Probleme dann fügen Sie mir Ihre Viewcontroller und cellFile mit allen IBOutlets und IBActions –

+0

Dank für neuen Code hat und posten wenn es nicht funktioniert. Aber könnten Sie cell.delegate sagen? Es zeigt einen Fehler, dass Zelle keine Delegate-Methode hat. Bitte helfen Sie dieses Problem zu beheben, um Ihren Code zu testen – cole

0

Steuer Behandeln Sie Ihren Schalter richtig für jede Zelle in,

tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) 

, so dass, wenn die Zelle dequeue ist, es jede Zelle Griffe switchControl richtig.

Lösung: Wenn Sie Zustand der Schaltersteuerung für die Zelle ändern, außer dass indexPath irgendwo so, dass, wenn Sie durch diese indexPath in Tableview iterieren cellForRowAt indexPath Sie diesen Zustand der Schalter wieder anders gesetzt Standardzustand

0

Changeed func Wert nennen könnte passieren, weil Zellen wiederverwendbar sind. prepareForReuse Methode in Ihren Zellen implementieren:

class TableCell: UITableViewCell { 
    .... 

    override func prepareForReuse() { 
     super.prepareForReuse() 
     self.yourSwitch.isOn = false 
    } 
} 

Und ja, man muss auch etwas wie ein Array mit den Staaten/Objekte verwenden, um die korrekte Schaltwerte in Zellen eingestellt.

+0

Ich würde sagen, dass der beste Weg ist nicht, 'prepareForReuse' zu ​​überschreiben, Zustand im Modell zu halten ist besser. – Stefan

+0

Hallo, ich habe das versucht, aber nicht funktioniert. – cole

Verwandte Themen