2017-09-03 1 views
0

Ich habe eine Funktion innerhalb eines Protokolls, das eine TableViewcell als Argument verwendet.Wie kann ich meine TableView-Zelle daran hindern, den Knopf darin wieder zu verwenden?

protocol GoingButtonDelegate { 
    func goingButtonPressed(cell: TableViewCell) 
} 

class TableViewCell: UITableViewCell { 
    // Outlets 
    @IBOutlet weak var goingButton: UIButton! 

    var delegate: GoingButtonDelegate? 

    @IBAction func goingButtonTapped(_ sender: Any) { 
     delegate?.goingButtonPressed(cell: self) 
    } 

ich dann gehen zu meinem Viewcontroller und die Delegaten implementieren und es ist Funktion, die das Bild einer Taste zu ändern ist, wenn angezapft. Das "goingSelected" ist ein grünes Bild und das "goingDeselected" ist ein rotes Bild.

Das alles funktioniert gut, wenn angezapft der Knopf einer Zelle von rot nach grün und umgekehrt geht. Wenn die Zelle jedoch erneut verwendet wird, bleibt der Schaltflächenstatus der Zelle bestehen und wird für die neue Zeile wiederverwendet, die in die Ansicht gelangt. Gibt es eine Möglichkeit, dies zu verhindern?

extension ViewController: GoingButtonDelegate { 
    func goingButtonPressed(cell: TableViewCell) { 
     cell.goingButton.isSelected = !cell.goingButton.isSelected 

     if cell.goingButton.isSelected == true { 
      cell.goingButton.setImage(UIImage(named: "goingSelected"), for: UIControlState.selected) 
     } else if cell.goingButton.isSelected == false { 
      cell.goingButton.setImage(UIImage(named: "goingDeselected"), for: UIControlState.normal) 
     } 
    } 
} 
+1

Mögliche Duplikat von [Wie UITableView zu verhindern, dass die Wiederverwendung individuelle Zellen Swift] (https://stackoverflow.com/ Fragen/37938809/how-to-verhindern-uitableview-from-reuse-custom-cells-swift) –

+0

Sie wollen nicht vermeiden, Zellen wieder zu verwenden. Das ist nicht die richtige Lösung. – rmaddy

Antwort

0

Es ist möglich,

nur

let cell = tableView.dequeueReusableCell(withIdentifier: identifier, 
    for: indexPath) 

mit ersetzen:

let cell= Bundle.main.loadNibNamed(identifier, owner: self, options: nil)?[0] 

aber ich denke, Sie Ihre App-Logik ändern müssen.

Set Images Innenseite der Zelle Klasse

class TableViewCell: UITableViewCell { 
    override func awakeFromNib() { 
    super.awakeFromNib() 
    self.goingButton.setImage(UIImage(named: "goingDeselected"), for:.normal) 
    self.goingButton.setImage(UIImage(named: "goingSelected"), for:.selected) 
    } 
} 

und in Verfahren goingButtonPressed(cell: TableViewCell) Änderung cell zu Ihrem Objekt und setzte nur Bool Art wahr oder falsch

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    ... 
    cell.goingButton.isSelected = object.isSelected 
    ... 
} 
+1

Sie möchten dies nicht tun. Vermeiden Sie nicht die Wiederverwendung von Zellen. – rmaddy

+0

@rmaddy Ich gebe bereits die Antwort, dass besser wird Änderungslogik sein –

0

Sie müssen die ausgewählten Zeilen speichern, in einem Array von Indexpfaden, davor sollten Sie einige Verbesserungen vornehmen ... oder eine Menge !!

die Zelle selbst sollte es Knopf handhaben, sollte der Controller nur den Status aller Zellen verfolgen. diese beiden Eigenschaften für Ihr Handy hinzufügen in Ihrem View-Controller

class TableViewCell: UITableViewCell { 
    var indexPath:IndexPath? 
    var isSelected : Bool = false { 
     didSet{ 
      if isSelected { 
       cell.goingButton.setImage(UIImage(named: "goingSelected"), for: UIControlState.normal) 
      } else { 
       cell.goingButton.setImage(UIImage(named: "goingDeselected"), for: UIControlState.normal) 
      } 
     } 
    } 
    // Outlets 
    @IBOutlet weak var goingButton: UIButton! 

    var delegate: GoingButtonDelegate? 

    @IBAction func goingButtonTapped(_ sender: Any) { 
     self.isSelected = !self.isSelected 
     delegate?.goingButtonPressed(cell: self) 
    } 
    .. 
    ... 
} 

und speichern Sie die ausgewählten Zellen Spur jeder Zelle Status zu halten.

extension ViewController: GoingButtonDelegate { 
    var selectedCells = NSMutableArray() 
    func goingButtonPressed(cell: TableViewCell) { 
     if cell.isSelected { 
      selectedCells.add(cell.indexPath) 
     } else { 
      selectedCells.remove(cell.indexPath) 
     } 
    } 
} 

und in der „Zelle für Zeile“ Methode fügen Sie einfach eine kleine Änderung

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "yourCellIdentifier") as! TableViewCell 
    cell.indexPath = indexPath 
    cell.isSelected = selectedCells.contains(indexPath) 
    .. 
    ... 
    return cell 
} 
Verwandte Themen