2009-04-07 16 views
5

Tengo otra pregunta sobre cómo restaurar el estado de la aplicación en el iPhone. Datos simples (como la pestaña seleccionada) se pueden almacenar en NSUserDefaults, pero no es suficiente.Otra pregunta sobre el estado de aplicación de iPhone

Quiero restaurar todo el estado, incluidos los Controles de navegación (vaya al Controlador de vista sub-sub-sub).

Mi problema es que mi aplicación está dividida en varios archivos xib, por lo que al principio, no se crean instancias de todos los controladores de vista. ¿Hay alguna manera de "forzar" la instanciación desde un archivo xib?

(no tengo código bajo la mano, pero puedo tratar de escribir una pequeña final si no está claro)

muchas gracias.

Respuesta

5

Calling [viewController view] se asegurará de que XI ter de un controlador de vista está cargado; una vez que esté, puede utilizar cualquiera de sus otras propiedades normalmente

Esto es lo que tienden a hacer:

@class Record; // some model object--I assume it has an integer record ID 
@class DetailViewController; 

@interface RootViewController : UIViewController { 
    IBOutlet DetailViewController * detailController; 
} 

- (void)restore; 
... 
@end 

@implementation RootViewController 

// Note: all detailController showings--even ones from within 
// RootViewController--should go through this method. 
- (void)showRecord:(Record*)record animated:(BOOL)animated { 
    [self view]; // ensures detailController is loaded 

    [[NSUserDefaults standardUserDefaults] setInteger:record.recordID 
               forKey:@"record"]; 
    detailController.record = record; 

    [self.navigationController pushViewController:detailController 
             animated:animated]; 
} 

- (void)restore { 
    int recordID = [[NSUserDefaults standardUserDefaults] integerForKey:@"record"]; 

    if(recordID) { 
     Record * record = [Record recordWithID:recordID]; 
     [rootViewController showRecord:record animated:NO]; 
     // If DetailViewController has its own state to restore, add this here: 
     // [detailController restore]; 
    } 
} 
... 
- (void)viewDidAppear:(BOOL)animated { 
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"record"]; 
} 
@end 

@implementation MyAppDelegate 

- (void)applicationDidFinishLaunching:(UIApplication*)application { 
    ... 
    [rootViewController restore]; 
    ... 
} 
... 
@end 

Cada nivel de la jerarquía de la vista se hace cargo de su propio estado de ahorro, por lo que el controlador de aplicación no tiene que saber acerca de todos los posibles puntos de vista y que ordena que pudieron estar en.

+0

Parece ser la solución perfecta, voy a probar eso tan pronto como sea posible. Gracias ! –

+0

La carga de todos los controladores en el arranque rompe el concepto de cargarlos perezosamente, aumentando el tiempo de inicio de la aplicación y el uso de la memoria. – Kornel

+0

No carga todos los controladores porque el subcontrolador no está cargado a menos que el supercontrolador tenga una identificación de registro para él. –

4

Lo hago en mi aplicación, Litho Graph. Si está en una página cuando sale, la próxima vez que lance, lo restaurará a esa página. También es bastante fácil: en la implementación de viewDidLoad de mi controlador de vista principal, busco la última clave vista en la página en los valores predeterminados del usuario. Si no hay nada, continúo como siempre (y muestro una lista de todas las páginas). Si hay algo, abro esa página (presionando el nuevo controlador de vista en la pila del controlador de navegación).

La carga real de los controladores de vista es muy sencilla: simplemente los instauro. Cada una de mis clases de controlador de vista ha reemplazado -init para llamar a -initWithNibName: bundle: en super, por lo que llamar + alloc y -init para crear la instancia del controlador de vista es suficiente para cargarlo desde el archivo .xib apropiado. Entonces, como se describió anteriormente, la empujo en la pila del mando de navegación:

[self.navigationController pushViewController: controller animated: YES]; 

Usted puede hacer esto tantas capas profundas como es necesario, por supuesto, pero hay que tener en cuenta que es posible que desee para empujar la vista controladores sin animación si va a haber varias transiciones; sería contraproducente para que el usuario tenga que esperar por varias animaciones (:.

0

Mire el código de muestra de manzanas "drilldownsave". hace exactamente lo que quiere

Cuestiones relacionadas