Ich habe eine UITableView
mit neu sortierbaren Zeilen und ich verwende die Standard UITableViewCell.text
Eigenschaft, um Text anzuzeigen. Wenn ich auf "Bearbeiten" tippe, eine Zeile verschiebe, auf "Fertig" tippe und dann auf die Zeile tippe, wird die integrierte UILabel
wird vollständig weiß (Text und Hintergrund) und undurchsichtig, und der blaue Farbton der Zelle wird nicht dahinter angezeigt. Woran liegt das? Gibt es etwas, das ich tun sollte, aber nicht tue? Ich habe ein hacky fix, aber ich will die echte McCoy.
So können Sie es reproduzieren:
Beginnend mit der Standardvorlage "Navigationsbasierte Anwendung" im iPhone OS 2.2.1 SDK:
-
RootViewController.m öffnen
-
Unkommentiert
viewDidLoad
und aktivieren Sie die Schaltfläche Bearbeiten:- (void)viewDidLoad { [super viewDidLoad]; // Uncomment the following line to display an Edit button in the navigation bar for this view controller. self.navigationItem.rightBarButtonItem = self.editButtonItem; }
-
Geben Sie an, dass die Tabelle nur wenige Zellen hat:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 4; }
-
En
tableView:cellForRowAtIndexPath:
fügen Sie eine Zeile hinzu, um die Texteigenschaft einer Zelle festzulegen und somit die integrierte UILabel-Unteransicht zu verwenden:// Set up the cell... cell.text = @"Test";
-
Um die Neuordnung zu aktivieren, deaktivieren Sie
tableView:moveRowAtIndexPath:toIndexPath:
. Die Standardimplementierung ist leer, was in diesem Fall in Ordnung ist, da die Vorlage kein Datenmodell enthält. -
Konfigurieren Sie das Projekt für den Simulator, OS 2.2.1, Build und Go. Wenn die App angezeigt wird, tippen Sie auf "Bearbeiten", schieben Sie eine beliebige Zeile an eine neue Position, tippen Sie auf "Fertig" und tippen Sie dann nacheinander auf jede einzelne Zeile. Normalerweise wählt ein Tippen eine Zeile aus, färbt sie blau und macht ihren Text weiß. Aber ein Tippen auf die Zeile, die Sie gerade verschoben haben, bewirkt genau das et lässt die Hintergrundfarbe des UILabels weiß. Das Ergebnis ist eine verwirrende weiße freie Fläche mit blauen Streifen an den Rändern. Merkwürdigerweise scheint nach dem ersten falschen Tippen ein weiteres Tippen das Problem zu beheben.
Bislang habe ich einen Hack gefunden, der das Problem behebt, aber ich bin nicht zufrieden damit. Er funktioniert, indem er sicherstellt, dass das eingebaute UILabel
nicht undurchsichtig ist und keine Hintergrundfarbe hat, sofort nach der Auswahl.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// hacky bugfix: when a row is reordered and then selected, the UILabel displays all crappy
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
for (UIView *view in cell.contentView.subviews) {
if ([[view class] isSubclassOfClass:[UILabel class]]) {
((UILabel *) view).backgroundColor = nil;
view.opaque = NO;
}
}
// regular stuff: only flash the selection, don't leave it blue forever
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
Das scheint zu funktionieren, aber ich erwarte nicht, dass es für immer eine gute Idee ist. Was ist der richtige Weg, um dies zu beheben?