uitableview - Reutilización de TableView Cell y marcas de verificación no deseadas: esto me está matando
reusability checkmark (1)
La reutilización de células puede ser complicada, pero debes tener en cuenta dos cosas:
- Utilice un identificador para un tipo de celda. Usar múltiples identificadores solo es realmente necesario cuando usa diferentes subclases de UITableViewCell en una vista de tabla y debe confiar en su comportamiento diferente para diferentes celdas
- La celda que reutiliza puede estar en cualquier estado , lo que significa que debe volver a configurar cada aspecto de la celda, especialmente checkmars / images / text / accessoryViews / accessoryTypes y más
Lo que debe hacer es crear un almacenamiento para sus estados de marca de verificación: una matriz simple que contenga bools (o NSArray que contenga objetos booleanos NSNumber respectivamente) debería hacerlo. Luego, cuando tenga que crear / reutilizar una celda, use la siguiente lógica:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *reuseIdentifier = @"MyCellType";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
if(cell == nil) {
/* create cell here */
}
// Configure cell now
cell.textLabel.text = @"Cell text"; // load from datasource
if([[stateArray objectAtIndex:indexPath.row] boolValue]) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
cell.accessoryType = UITableViewCellAccessoryNone;
}
return cell;
}
entonces deberás reaccionar con grifos:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[stateArray replaceObjectAtIndex:indexPath.row withObject:[NSNumber numberWithBool:![[stateArray objectAtIndex:indexPath.row] boolValue]]];
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
Solo recuerda usar NSMutableArray
para tu tienda de datos;)
El TableView
iOS de TableView
y la reutilización de celulares me están matando. Busqué, busqué y estudié, pero no puedo encontrar buenos documentos ni buenas respuestas. El problema es que cuando TableView
reutiliza celdas, las cosas como las TableView
(accesorio de celda) configuradas en una Celda seleccionada se repiten en las celdas más abajo en la vista de tabla. Entiendo que la reutilización de la celda es por diseño, debido a las restricciones de memoria, pero si tiene una lista con, por ejemplo, 50 elementos, y comienza a establecer marcas de verificación adicionales donde no se desean, esto hace que todo el esfuerzo sea inútil.
Todo lo que quiero hacer es establecer una marca de verificación en una celda que he seleccionado. Lo he intentado utilizando mi propia clase de celda personalizada y las celdas estándar generadas por una placa de caldera clase TableView, pero siempre termina igual.
Apple incluso tiene un proyecto de ejemplo llamado TouchCell que puede descargar desde el centro de desarrollo, que se supone que muestra una forma diferente de establecer una marca de verificación usando una celda personalizada con un control de imagen a la izquierda. El proyecto utiliza un objeto de diccionario para una fuente de datos en lugar de una matriz mutable, por lo que para cada elemento hay un valor de cadena y un valor comprobado bool. Se supone que este valor comprobado bool establece la marca de verificación para que pueda rastrear los elementos seleccionados. Este proyecto de ejemplo también muestra este comportamiento ridículo tan pronto como rellena el TableView con más de 15 celdas. La reutilización de las celdas comienza a establecer marcas de verificación no deseadas.
Incluso he intentado experimentar con el uso de un identificador de celda verdaderamente único para cada celda. Así que, en lugar de que cada celda tenga algo como @ "Acell", utilicé una int estática, fundida en una cadena para que las células obtuvieran @ "cell1", @ "cell2" etc. Durante la prueba, pude ver que cientos de nuevas células generado durante el desplazamiento, incluso si la tabla solo tenía 30 elementos.
Solucionó el problema de repetición de la marca de verificación, pero sospecho que el uso de la memoria iba demasiado alto.
Es como si las celdas que no se encuentran actualmente en el área visible de la tabla se crearan de nuevo cuando se vuelvan a visualizar.
¿Alguien ha encontrado una solución elegante a este comportamiento irritante?