2017-11-30 1 views
0

Ich habe eine Schaltfläche innerhalb einer UICollectionViewCell (benutzerdefinierte Klasse) in einer UICollectionView. Wenn Sie auf die Schaltfläche klicken, ändert sich ihre Hintergrundfarbe. Funktioniert zuerst perfekt, aber wenn ich die Hintergrundfarbe der Hauptansicht ändere, kann ich die Hintergrundfarbe der Taste nicht aktualisieren. Die Hintergrundfarben in einem Array gespeichert sind, und hier sind die Zelle Set-up-Funktion:Change Button Hintergrund in UICollectionViewCell

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    print("Rebuilding cells") 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! ColorCollectionViewCell 
    cell.button.tappedColor = backgroundColors[section] 
    cell.button.originalColor = backgroundColors[section + 1] 
    cell.button.delegate = self 
    cell.button.addTarget(self, action: #selector(didHitButton), for: .touchUpInside) 
    return cell 
} 

Also, wenn ich mit section als 1 starte, lädt es die Schaltfläche der Zelle mit der richtigen Hintergrundfarbe (schwarz, die die erste Farbe Dann setze ich die Zählung auf Null und grid.reloadData(), die die Zellen erfolgreich löscht.

Aber wenn ich section auf 2 setze und die Gesamtzellzahl wieder zurücksetze, nehmen die Zellen das neue nicht an Hintergrundfarbe (Farbe des Abschnitts 2 ist grün) Sie bleiben schwarz aus Abschnitt 1.

Wie würde ich dem UICollectionView sagen, die Hintergrundfarbe der Schaltfläche in der Zelle neu zu zeichnen, wenn die Daten aktualisiert werden, wobei diese Hintergrundfarbe von einem Array kommt, das auf einer Variablen für die index basiert?

Antwort

0

Ich denke, Sie sollten die .backgroundColor Eigenschaft der Ansichten verwenden, um die Hintergrundfarbe einzustellen, um es anzuzeigen.

Anders als das, mit jedem tableView.reload() werden alle Ihre TableView-Delegate-Methoden erneut aufgerufen und Ihre Zellen werden mit den von Ihnen bereitgestellten Daten neu verknüpft ... also müssen Sie sie so behandeln, als wären sie nicht initialisiert. Dies könnte auch darauf hinweisen, dass, wenn Sie nicht die richtigen Farben zugewiesen bekommen, schwarz ihre Standardfarbe ist und vielleicht auch nicht für section 1 funktioniert oder Sie sollten die in Ihrem Array gespeicherten Daten überprüfen (Sie können debuggen oder Drucke sie).

Für einen sauberen Fluss der Logik nur tun:

if indexPath.section == 0 { 
    // do this for section 0 
} else if indexPath.section == 1 { 
    // do this for section 1 
} else { 
    // for all other if any 
} 

Hope this SieFormal in someway ...

+0

Die Schaltfläche in der Zelle ist eine benutzerdefinierte Klasse hilft. tappedColor und originalColor legen diese Hintergrundfarbe für die Schaltfläche fest, also mache ich das. Es ist nur so, dass das erneute Laden der Daten die Werte von tappedColor und originalColor nicht auf das nächste Element im Farb-Array aktualisiert, sodass diese Änderungen der Hintergrundfarbe nicht durchgehen. – gr8m8

+0

Nun, Debuggen, um die Ursache zu finden, ist Ihre beste Wette, setzen Sie einen Haltepunkt und überprüfen Sie bei der CellForRowAt-Methode, um zu sehen, ob Ihr Array die richtigen Werte enthält und wenn die Abschnitt Werte auch richtig kommen ... Auch, haben Sie versucht Die if-else-Methode überprüft Abschnitt Wert wie in meiner Antwort? da du dein Array mit Abschnitt und Abschnitt + 1 indizierst, wenn du zwei Abschnitte hast, dann erhältst du 0,1 und 1,2 ... –