2008-11-30 19 views
5

He intentado preservar el estado de mi aplicación de iPhone serializando mi UITabBarController principal usando [NSKeyedArchiver archiveRootObject:toFile:], pero estoy teniendo problemas.Preservar el estado de la aplicación en reinicios

Primero tuve un problema con UIImage, ya que no implementa el protocolo NSCoding, pero resolvió que al hacer una categoría de extensión para UIImage que almacena y recupera los datos de imágenes en bruto.

El problema en el que estoy atascado ahora es que mis controladores de vista no están allí cuando restauro del archivo. Tengo UINavigationControllers en cada una de mis pestañas, y cuando restauro, las UINavigationItem s todavía están allí (puedo usar los botones Atrás y así sucesivamente para cambiarlas) pero los controles de vista simplemente se han ido.

Veo que UINavigationController 's viewControllers propiedad se marca (nonatomic, copy). ¿Significa esto que cuando archiva un UINavigationController, no incluye su pila de controladores de vista? Si es así, ¿cómo puedo evitar esto? Primero pensé que anularía los métodos NSCoding para UINavigationController, pero esto daña la inicialización del archivo NIB.

Estoy un poco perturbado porque he estado teniendo esta dificultad para preservar el estado de la aplicación. Pensé que era un caso de uso bastante común que sería sencillo de implementar. ¿Me estoy perdiendo de algo?

Respuesta

5

Los atributos en @property tienen poco o nada que ver con el comportamiento de archivado (solo describen cómo funcionan getters y setters).

Además, el hecho de que las clases de IU sean compatibles con NSCoding no significa que pueda usarse para reconstruir el estado. La mayoría de las veces, admiten NSCoding para que puedan construirse y cargarse desde un archivo NIB utilizando Interface Builder. Si piensa en todos los bits de estado que no puede configurar en el Generador de interfaces, es posible que la implementación de NSCoding en la clase no admita cualquier cantidad de estas características.

Normalmente, las personas no usan NSCoding para almacenar el estado de la aplicación porque exactamente lo que constituye el estado de la aplicación es específico para su aplicación.

El estado de la aplicación de guardado normalmente implica el almacenamiento de valores que le permitiría volver a crear el estado. es decir, almacenar el índice de una pestaña seleccionada o una serie de índices seleccionados que representan la ruta recorrida a través de un controlador de navegación.

3

Nunca fui capaz de hacer que este enfoque funcionara bien. Lo que mencioné fue tener mi propio protocolo y tener cada controlador de vista para guardar/restaurar los metadatos necesarios para esa vista (no es necesario guardar los datos de la imagen, por ejemplo, solo el nombre de la imagen). Una vez que tenga eso, es bastante fácil escribir un código genérico para recorrer los controladores de navegación (+ pilas) y guardar/restaurar todo el conjunto de datos. parece mucho trabajo, pero en realidad fue bastante fácil.

5

¿Por qué intentas archivar todo el controlador de la barra de pestañas? Simplemente use NSUserDefaults y guarde el índice de pestañas seleccionado. Luego, cuando cargue la aplicación, seleccione el índice de pestaña según el valor guardado.

Cuestiones relacionadas