Ich habe eine Mehrfachauswahlliste erstellt, die die Auswahl mehrerer Zutaten ermöglicht.UITableViewCell Wiederverwendung: Zelle wird falsch angezeigt - wird nicht wie erwartet wiederverwendet
In meiner Tabellenansicht können Zellen basierend auf der Listeneigenschaft eines Inhaltsstoffs entweder aktiviert oder deaktiviert werden. Wenn die Listeneigenschaft des Inhaltsstoffs festgelegt ist, wird die Zelle deaktiviert.
Wenn eine Zelle jedoch erneut verwendet wird, wird sie nicht wie erwartet angezeigt. Die Bilder unten erklären das Problem besser als ich.
(Die Zutaten, die nicht aktiviert werden sollten, sind: Kuchen-Zuckerglasur, Kondensmilch und Cournflour.)
Das erste Bild zeigt die drei Bestandteile deaktiviert, und wie erwartet, annotiert.
Im zweiten Bild zeigt das Scrollen nach unten jedoch, dass einige Zutaten deaktiviert sind (aber Sie können sie auswählen, und sie haben volle Interaktion).
Das dritte Bild zeigt die Liste nach dem Zurückscrollen nach oben. Einige Zutaten wurden ausgegraut und Sie sehen, wie Maismehl als aktiviert angezeigt wird, obwohl Sie nicht interagieren/auswählen können.
Das Problem liegt in der Wiederverwendung von Zellen. Es scheint, dass die Zelle nicht "zurückgesetzt" wird, wenn sie erneut verwendet wird, und so etwas von ihrem "alten" Aussehen behält.
Unten ist der Code von cellForRowAtIndexPath:
, da bin ich sicher, dass hier das Problem liegt (obwohl ich nicht sehen kann, was falsch ist).
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
// Fetches the corresponding Ingredient from the ingredientArray
Ingredient *ingredient = [self.ingredientArray objectAtIndex:indexPath.row];
if ([ingredient.list isEqualToString:@"Lardr"])
{
cell.userInteractionEnabled = NO;
cell.detailTextLabel.text = @" Already in your Lardr";
}
else if ([ingredient.list isEqualToString:@"Shopping List"])
{
cell.userInteractionEnabled = NO;
cell.detailTextLabel.text = @" Already on your Shopping List";
}
else
{
cell.userInteractionEnabled = YES;
cell.detailTextLabel.text = @"";
}
// Add a checkmark accessory to the cell if the ingredient is on the selectedIngredients array
if ([self.selectedIngredients containsObject:ingredient])
cell.accessoryType = UITableViewCellAccessoryCheckmark;
else
cell.accessoryType = UITableViewCellAccessoryNone;
cell.textLabel.text = ingredient.name;
return cell;
}
Ich bin am Ende meiner Weisheit versucht, dies herauszufinden, und ich habe alle SO Fragen lesen, die auch nur entfernt verwandt sind, aber ohne Erfolg. Was ist das Problem?!
Meine Logik ist für jede Zelle, dass die textlabel, detailTextLabel, userInteractionEnabled und accessoryType Eigenschaften festgelegt sind, unabhängig davon, welche Ausführungspfad durch die if-Anweisungen, so kann ich nicht sehen, warum auch nach der Wiederverwendung, die Zelle wird nicht korrekt angezeigt.
EDIT: In einem Versuch, die Wurzel des Problems herauszufinden, habe ich versucht, „Zurücksetzen“, um die Zelle zurück, um es Standard ist, indem es die folgende rechts oberhalb der Linie, die die entsprechenden Zutaten holt: aber ohne Erfolg.
cell.userInteractionEnabled = YES;
cell.textLabel.text = nil;
cell.detailTextLabel.text = nil;
cell.accessoryType = UITableViewAccessoryNone;
Doch was ist interessant und völlig unlogisch - wenn ich die folgende Zeile cell.textLabel.text = ingredient.name
bewegt, um direkt unterhalb der Zeile, die Ingredient *ingredient = [self.ingredientArray objectAtIndex:indexPath.row];
liest, wird absolut kein Styling auf jede Zelle angewendet, obwohl Anwenderwechsel weiter unten gesetzt (und die relevanten Zellen sind wie erwartet deaktiviert).
Ich denke, ist die Reihenfolge, in der eine Zelleneigenschaften festgelegt sind, von Bedeutung? Ich weiß es sollte nicht, aber das Aussehen ändert sich basierend auf dem oben genannten.
Update: Ich habe das Problem gelöst; Siehe meine Antwort unten.
Verwenden Sie StoryBoards? –
Was macht den Text grau? –
Mit dem von Ihnen geposteten Code ist nichts falsch. Wenn die Benutzerinteraktion auf NO gesetzt wird, wird der Text nicht grau dargestellt. Ich denke, dein Problem liegt wahrscheinlich bei der Methode, mit der du das machst. – rdelmar