Ho creato un elenco di selezione multipla che consente la selezione di più ingredienti.UITableViewCell Riutilizzo: cella visualizzata in modo errato - non riutilizzata come previsto
Nella mia vista tabella, le celle possono essere abilitate o disabilitate in base alla proprietà elenco di un ingrediente. Se la proprietà dell'elenco Ingredient è impostata, la cella sarà disabilitata.
Tuttavia, quando una cella viene riutilizzata, non viene visualizzata come mi aspetterei. Le immagini sottostanti spiegano il problema in modo più efficace di me.
(Gli ingredienti che non devono essere abilitati sono: Glassa, latte condensato e Cournflour.)
La prima immagine mostra i tre ingredienti disabili e annotati come previsto.
Tuttavia, nella seconda immagine, lo scorrimento verso il basso rivela che alcuni ingredienti sono disabilitati (ma è possibile selezionarli e hanno un'interazione completa).
La terza immagine mostra l'elenco dopo averlo fatto scorrere in alto. Alcuni ingredienti sono stati disattivati e si noti come Cornflour è visualizzato come abilitato, anche se non è possibile interagire/selezionarlo.
Il problema ha a che fare con il riutilizzo delle celle. Sembra che la cella non venga "ripristinata" quando viene riutilizzata, e quindi mantiene alcuni dei suoi "vecchi" aspetti.
Di seguito è il codice da cellForRowAtIndexPath:
, come sono sicuro che questo è dove il problema è (anche se non riesco a vedere cosa c'è che non va).
- (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;
}
Sono alla fine del mio ingegno cercando di capire questo fuori, e ho letto tutto così domande che sono neanche lontanamente legati, ma senza alcun risultato. Qual è il problema?!
mia logica è che per ogni cella, le proprietà textLabel, detailTextLabel, userInteractionEnabled e accessoryType sono impostati, non importa quale esecuzione percorso attraverso il if, quindi non posso vedere perché, anche dopo il riutilizzo, il la cella non viene visualizzata correttamente.
EDIT: Nel tentativo di capire la radice del problema, ho provato "reset" cella nuovo esso è predefinito aggiungendo il seguente proprio sopra la linea che recupera il corrispondente Ingrediente: ma senza risultato.
cell.userInteractionEnabled = YES;
cell.textLabel.text = nil;
cell.detailTextLabel.text = nil;
cell.accessoryType = UITableViewAccessoryNone;
Tuttavia, ciò che è interessante e completamente illogica - quando ho spostato la seguente linea cell.textLabel.text = ingredient.name
a direttamente sotto la riga Ingredient *ingredient = [self.ingredientArray objectAtIndex:indexPath.row];
, assolutamente NO styling è applicato a qualsiasi cella, anche se UserInteraction è impostato più avanti (e le celle rilevanti sono disabilitate come previsto).
Sto pensando, l'ordine in cui sono impostate le proprietà di una cella è importante? So che non dovrebbe, ma l'aspetto cambia in base a quanto sopra.
Aggiornamento: ho risolto il problema; vedi la mia risposta qui sotto.
Stai usando StoryBoards? –
Cosa sta facendo diventare grigio il testo? –
Non c'è niente di sbagliato in quel codice che hai postato. L'impostazione dell'interazione dell'utente su NO non rende il testo più grigio. Penso che il tuo problema risieda probabilmente in qualunque metodo tu stia usando per farlo. – rdelmar