Ich habe eine Tabellenansicht mit 8 Zellen. Jedes enthält ein Etikett. Für die letzten 4 Zellen möchte ich, dass die Texteigenschaft des Etiketts eine blaue Farbe hat. Für die ersten vier Zellen möchte ich, dass sie eine schwarze Farbe haben.

Ich habe die Textfarbe in cellForRowAt indexPath mit dem folgenden Code auf blau gesetzt:

if indexPath.row > 4 {
    cell.label.textColor = UIColor.blue
}

Dadurch wird die Farbe in Blau geändert. Wenn der Benutzer jedoch nach unten und dann wieder nach oben scrollt, haben die ersten beiden Zellenbezeichnungen ebenfalls eine blaue Farbe, da die Zellen wiederverwendet wurden.

Wie kann ich das lösen? Vielen Dank.

1
lajosdeme 18 Jän. 2019 im 15:11

5 Antworten

Beste Antwort

Erstens setzt Ihr Code in seinem aktuellen Zustand die Farbe aller Zellen, deren Indizes größer als 4 sind, auf blue, nicht nur der letzten 4 Zellen. Sie müssen Ihren Zustand ändern.

Danach müssen Sie eine else-Anweisung hinzufügen, um die Farbe anderer Zellen zu verarbeiten, die Zellen, die die Bedingung nicht erfüllen. Dies liegt daran, dass die Zellen wiederverwendet werden und daher immer ihre Farbe eingestellt werden muss.

Ihr Code sollte also ungefähr so aussehen:

if indexPath.row > numberOfRows - 4 {
    cell.label.textColor = .blue
} else {
    cell.label.textColor = .black
}

Oder wie von @jarvis erwähnt, können Sie den ternären Operator verwenden, um Ihren Code kompakter zu gestalten:

cell.label.textColor = indexPath.row > numberOfRows - 4 ? .blue : .black

numberOfRows ist die Anzahl der Zeilen in der Tabellenansicht.

1
Moe 18 Jän. 2019 im 12:22

Sie müssen Ihrer cellForRow-Methode seit dem Problem der Warteschlange oder dem Problem der Wiederverwendung von Zellen einen weiteren Teil hinzufügen.

cell.label.textColor = indexPath.row > 4 ? .blue : .black

Hinweis: Denken Sie immer daran, else Teil zur cellForRow-Methode hinzuzufügen, andernfalls verhält es sich seltsam.

2
Jarvis The Avenger 18 Jän. 2019 im 12:18

Sie müssen auch die Bedingung else festlegen, damit sie sich nicht ändert

if indexPath.row > 4 {
    cell.label.textColor = UIColor.blue
}
else {
    cell.label.textColor = UIColor.black
}
0
Uma Madhavi 18 Jän. 2019 im 12:14

Das liegt daran, dass die Zelle tatsächlich wiederverwendet wird. Um dies zu lösen, benötigen Sie eine Logik, was mit den Zellen / Zeilen zu tun ist, die Ihre Bedingung indexPath.row > 4 nicht erfüllen. :) :)

0
Glenn 18 Jän. 2019 im 12:15

Das liegt daran, dass die Zelle tatsächlich wiederverwendet wird.

Stellen Sie sicher, dass Sie jedes Mal in UITableView und UICollectionView die Bedingung else verwenden, damit der Wert während des Scroalling nicht ausgetauscht wird.

Hier sind 2 Methoden, die Sie befolgen können, damit sich die Farben nicht austauschen.

cell.label.textColor = indexPath.row > 4 ? .blue : .black

ODER

if indexPath.row > 4 {
    cell.label.textColor = UIColor.blue
}
else {
    cell.label.textColor = UIColor.black
}
0
PinkeshGjr 18 Jän. 2019 im 12:24