2010-01-15 23 views
6

Tengo un UITableView con el estilo "Agrupado" que utilizo para establecer algunas opciones en mi aplicación. Me gustaría que una de las celdas de esta UITableView aparezca solo en función de si otra de las celdas de UITableView está activada o no. Si no es así, debería aparecer la primera celda (preferiblemente con una animación suave), si es así, la primera celda debería ocultarse.¿Puedo mostrar/ocultar una determinada celda en una UITableView dependiendo del estado de otra celda?

Intenté devolver nil en el -tableView:cellForRowAtIndexPath: apropiado para ocultar la celda, pero eso no funciona y en su lugar arroja una excepción.

Actualmente estoy atascado y sin ideas de cómo resolver esto, así que espero que algunos de ustedes puedan señalarme en la dirección correcta.

Respuesta

9

Aquí hay un post muy útil en el que el autor proporciona un código fuente para la realización de animaciones en la celda seleccionada actualmente:

http://iphonedevelopment.blogspot.com/2010/01/navigation-based-core-data-application.html

Está usando esto en un contexto NSFetchedResultsController, pero se puede ver cómo está usando varias llamadas para agregar/eliminar celdas & secciones.

Ahora, en su caso, tendrá que modificar cualquier matriz que está utilizando para albergar los datos utilizados para generar las filas de la tableView cuando se "active" su celular, a continuación, utilizar selectivamente:

  • tableView: insertRowsAtIndexPaths: withRowAnimation:
  • tableView: deleteRowsAtIndexPaths: withRowAnimation:
  • tableView: insertSections: withRowAnimation:
  • tableView: deleteSections: withRowAnimation:

para ajustar las cosas en consecuencia (puede comenzar con tableView: reloadData :, pero es ineficaz).

Me doy cuenta de que la API puede ser un poco desalentadora, pero tómese el tiempo para leerla y comprender lo que hacen las distintas llamadas. Comprender cómo usa UITableView su fuente de datos y su delegado, así como la cadena de eventos que se producen cuando se seleccionan/eliminan las células/etc., Es importante si quiere que todo salga bien (y sin bloqueos).

+0

+1 Ese enlace parece interesante. – gerry3

+0

¡Gracias, lo descubrí con la ayuda de su publicación! :) –

9

Debe eliminar los datos detrás de las celdas ocultas de la fuente de datos de la vista de tabla.

Por ejemplo, si está utilizando una matriz, cuando ocurre una acción que hace que se oculte una celda, eliminaría el objeto para esa fila de la matriz. Luego, como fuente de datos de la vista de tabla, la matriz devolverá un recuento total menos y solo devolverá celdas válidas para cada fila en ese recuento (ninguna nula).

Este enfoque puede requerir el mantenimiento de una segunda matriz con todos los objetos (incluido el oculto).

Para actualizar la vista, visita reloadRowsAtIndexPaths:withRowAnimation:.

+0

Gracias, esto también fue útil. Apenas mi reputación lo permita, lo votaré mejor. –

2
[tableView beginUpdates]; 
[tableView deleteRowsAtIndexPaths:withRowAnimation:]; // or insertRowsAtIndexPaths:withAnimation: 
[tableView endUpdates]; 
+0

Justo lo que necesitaba. – To1ne

0

Antes cellForRowAtIndexPath se llama, numberOfRowsInSection se llama. Debería devolver el valor apropiado de celdas en la sección de allí, de modo que si solo desea mostrar 1 celda, devuelva una. La lógica de lo que las células se muestra tiene que ser implementado parcialmente en ambos métodos

Cuestiones relacionadas