iPhone: ¿la forma más sencilla de mantener el estado de una vista de tabla?

Actualmente tengo una vista de tabla simple con 7 celdas. Cuando se selecciona una fila, agrego una marca de verificación a una celda y viceversa, cuando se selecciona una celda que ya está marcada, se desmarca.

Sin embargo, cuando salgo de la vista de tabla y devuelvo, todas las marcas de verificación desaparecen.

Me preguntaba cuál es la solución más simple en IOS para mantener el estado de las celdas marcadas de modo que cuando vuelva a la vista de tabla, las marcas de verificación sigan ahí para las celdas marcadas.

preguntado el 16 de mayo de 11 a las 17:05

5 Respuestas

Leí una serie de publicaciones hace un tiempo sobre el tema. Parece que no puedo encontrar el que me ayudó, pero aquí hay algunos que pensé que eran buenos:

contestado el 16 de mayo de 11 a las 21:05

La forma más sencilla de hacer esto sería guardar estos estados marcados en algún lugar de la vista de tabla. Eso supone que su vista de tabla permanece en la memoria en algún lugar cuando abandona la pantalla. Si la vista de tabla no se guarda en la memoria (ya que la asigna cuando decide navegar allí y se libera cuando se va), entonces probablemente sería más fácil guardarla en algún lugar del delegado de la aplicación, ya que nosotros saber que queda en la memoria durante la vida útil de la aplicación

contestado el 16 de mayo de 11 a las 21:05

Esta es una muy mala sugerencia y rompe con el patrón MVC. Lo que busca es el estado de la fuente de datos que alimenta las células, no la vista de tabla en sí. - jer

No veo por qué esto rompe el patrón MVC, aparte del hecho de que la ubicación que elegí describir para guardar los datos no es explícitamente un objeto "modelo", o por qué eso lo convierte en una mala sugerencia. - Dan F

La ubicación que eligió para describir dónde guardar los datos es el objeto de vista (la vista de tabla), que es el lugar equivocado, incluso si guardar este tipo de información en las vistas estaba bien, sería una propiedad de la celda en ese caso . Sin embargo, incluso eso es incorrecto, ya que estos son datos que se usan para poblar una celda y no son parte del código de dibujo de la celda, etc. Es un modelo de datos clásico, datos. - jer

¿Qué hay de malo en que la tabla sepa con qué debe rellenar las celdas, especialmente si está utilizando tableView:cellForRowAtIndexPath: - Dan F

Esa no es la vista de tabla ... esa es su fuente de datos, que es la forma correcta de hacer las cosas, como mencioné anteriormente. - jer

Lo que desea hacer es en su modelo de datos que proporciona los datos desde los que se configura cada celda, agregue una bandera (si aún no tiene una) que se usará para indicar este caso. Asegúrese de configurar la marca de verificación en la celda en tableView:cellForRowAtIndexPath: basado en su modelo de datos para esa celda en particular.

Cuando regrese, siempre que su fuente de datos no haya cambiado, cuando la vista de tabla configure sus celdas nuevamente antes de mostrar la vista de tabla, usará esos datos para mostrar la marca de verificación según la configuración en su fuente de datos.

contestado el 16 de mayo de 11 a las 21:05

almacenar estado de vista de tabla en sqlite

contestado el 17 de mayo de 11 a las 10:05

guardar el estado en NSUserDefaults.

en su método de delegado didSelectRowAtIndexPath tableView establezca el usuario predeterminado con algo como esto:

NSUInteger defaultsCheckedRow=[[NSUserDefaults standardUserDefaults] integerForKey:@"rowForCheckedCellInNameOfTableViewController"];
if (defaultsCheckedRow==indexPath.row){
   // deselect the row 
   defaultsCheckedRow=defaultsCheckedRow*-1;
}else{
   defaultsCheckedRow=indexPath.row;
}
[[NSUserDefaults standardUserDefaults] setInteger: defaultsCheckedRow forKey: "rowForCheckedCellInNameOfTableViewController"]
[[NSUserDefaults standardUserDefaults] synchronize];
[self.tableView reloadData];

Luego, en su método cellForRowAtIndexPath: Data source delegate, puede hacer algo como:

NSUInteger defaultsCheckedRow=[[NSUserDefaults standardUserDefaults] integerForKey:@"rowForCheckedCellInNameOfTableViewController"];
if (indexPath.row==defaultsCheckedRow){
   cell.accessoryType=UITableViewCellAccessoryCheckmark;
}else{
   cell.accessoryType=UITableViewCellAccessoryNone;
}

contestado el 17 de mayo de 11 a las 19:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.