Question

J'ai une autre question sur la restauration de l'état d'application, sur l'iPhone. données simples (comme l'onglet sélectionné) peuvent être stockés dans NSUserDefaults, mais il ne suffit pas.

Je veux restaurer tout l'état, y compris les contrôleurs de navigation (passer au sous-sous-sous View Controller).

Mon problème est que mon application est divisée en plusieurs fichiers XIB, donc au début, tous les contrôleurs de vue ne sont pas instanciés. Est-il possible de « forcer » l'instanciation d'un fichier xib?

(je n'ai pas de code sous la main, mais je peux essayer d'écrire un petit bout si on ne sait pas)

Merci beaucoup.

Était-ce utile?

La solution

L'appel [viewController view] fera en sorte que le chargement d'un contrôleur XIB de vue donné; une fois qu'il est, vous pouvez utiliser l'une de ses autres propriétés normalement.

Voici ce que je tends à faire:

@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

Chaque niveau de la hiérarchie de vue prend soin de sa propre sauvegarde de l'état, de sorte que le contrôleur de l'application ne doit pas connaître toutes les vues possibles et quelles commandes ils pourraient être.

Autres conseils

Je le fais dans mon application, Litho Graph. Si vous êtes sur une page lorsque vous quittez, puis la prochaine fois que vous lancez, il vous rend cette page. Il est assez facile aussi: dans ma principale mise en œuvre -viewDidLoad du contrôleur de vue, je vérifie la dernière page clé vu dans les paramètres utilisateur par défaut. S'il n'y a rien, je continue comme d'habitude (et montrer une liste de toutes les pages). S'il y a quelque chose, j'ouvre cette page (en poussant le nouveau contrôleur de vue sur la pile du contrôleur de navigation).

Le chargement réel des contrôleurs de vue est très simple: je les instancier. Chacun de mon point de vue des classes de contrôleur a -init appeler substituée -initWithNibName: bundle: Super, afin d'appeler + alloc et -init pour créer l'instance de contrôleur de vue suffit de le charger à partir du fichier .xib approprié. Puis, comme décrit ci-dessus, je le pousse sur la pile du contrôleur de navigation:

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

Vous pouvez le faire autant de couches profondes que vous devez, bien sûr, mais gardez à l'esprit que vous voudrez peut-être pousser les contrôleurs de vue sans animation s'il va y avoir plusieurs transitions; il serait contre-productif pour l'utilisateur d'avoir à attendre à travers plusieurs animations (:

Regardez les pommes "drilldownsave" exemple de code. fait exactement ce que vous voulez

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top