Question

I ai une application qui a un UITabBarController avec deux languettes, chacune ayant son propre dispositif de commande de navigation. Maintenant, je veux stocker l'état de l'application lorsque l'utilisateur ferme, de sorte que lorsque l'utilisateur relauches l'application montrera au même endroit que la dernière fois avant qu'il ne soit fermé.
Donc, en applicationWillTerminate: J'ai

[NSKeyedArchiver archiveRootObject:tabBarController toFile:@"lastVisitedTab"];

Alors, en applicationDidFinishLaunching: J'ai

UITabBarController *last= (UITabBarController *)[NSKeyedUnarchiver unarchiveObjectWithFile:@"lastVisitedTab"];
if (last)
    tabBarController = [last retain];

J'ai aussi une extension UIImage pour le rendre conforme à NSCoding. Cependant, cela ne fonctionne pas, car l'état ne se conserve pas. Le premier onglet sélectionné obtient tout le temps, et aucune navigation est préservée soit.
Quelqu'un peut-il me dire ce qui ne va pas, ou me montrer comment le faire correctement?

Était-ce utile?

La solution 2

Je me suis dit comment faire enfin, grâce à Felixyz idée de . Voici ce que je dois faire pour les onglets de magasin, quelles que soient leurs données. Si, dit, une vue est chargé avec les données téléchargées à partir d'une URL, stocker l'URL au lieu de la vue entière. Vous devez remplacer

- (void)encodeWithCoder:(NSCoder *)encoder
- (id)initWithCoder:(NSCoder *)decoder

dans votre sous-classe UIViewController pour dire au contrôleur de vue de sauvegarder les données appropriées avant l'arrêt de l'application.
Maintenant, dans votre délégué de l'application enregistrer les données avant quiting

- (void)applicationWillTerminate:(UIApplication *)application
    // data buffer for archiving
    NSMutableData *data = [NSMutableData data];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    // the index of selected tab
    [archiver encodeInt:tabBarController.selectedIndex forKey:@"TAB_INDEX"];
    // array of keys for each navigation controller, here I have 3 navigation controllers
    NSArray *keys = [NSArray arrayWithObjects:
                     @"NAVIGATION_CONTROLLER_1",
                     @"NAVIGATION_CONTROLLER_2",
                     @"NAVIGATION_CONTROLLER_3", nil];
    for (int i = 0; i < keys.count; i++) {
        UINavigationController *controller = [tabBarController.viewControllers objectAtIndex:i];
        NSMutableArray *subControllers = [NSMutableArray arrayWithArray:controller.viewControllers];
        // the first view controller would already be on the view controller stack and should be removed
        [subControllers removeObjectAtIndex:0];
        // for each of the navigation controllers save its view controllers, except for the first one (root)
        [archiver encodeObject:subControllers forKey:[keys objectAtIndex:i]];
    }
    [archiver finishEncoding];
    // write that out to file
    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    [data writeToFile:[documentsDirectory stringByAppendingPathComponent:@"ARCHIVE_PATH"] atomically:YES];
}

Et puis, quand relançant

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    // set up the tabs
    tabBarController = [[UITabBarController alloc] init];
    tabBarController.viewControllers = [NSArray arrayWithObjects:
                                        [[[UINavigationController alloc] initWithRootViewController:rootViewController1] autorelease],
                                        [[[UINavigationController alloc] initWithRootViewController:rootViewController2] autorelease],
                                        [[[UINavigationController alloc] initWithRootViewController:rootViewController3] autorelease], nil];
    // look for saved data, if any
    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSData *archive = [NSData dataWithContentsOfFile:[documentsDirectory stringByAppendingPathComponent:@"ARCHIVE_PATH"]];
    // if no data found, skip this step
    if (archive) {
        NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:archive];
        // set the tab
        tabBarController.selectedIndex = [unarchiver decodeIntForKey:@"TAB_INDEX"];
        NSArray *keys = [NSArray arrayWithObjects:
                         @"NAVIGATION_CONTROLLER_1",
                         @"NAVIGATION_CONTROLLER_2",
                         @"NAVIGATION_CONTROLLER_3", nil];
        // push view controllers up the stack
        for (int i = 0; i < keys.count; i++) {
            NSArray *controllers = [unarchiver decodeObjectForKey:[keys objectAtIndex:i]];
            for (UIViewController *controller in controllers) {
                [((UINavigationController *)[tabBarController.viewControllers objectAtIndex:i]) pushViewController:controller animated:NO];
            }
        }
    }
    // Add the tab bar controller's current view as a subview of the window
    [window addSubview:tabBarController.view];
}

Autres conseils

Je pense qu'il est exagéré de persister les objets réels. Au lieu de cela, il suffit de sauvegarder la propriété selectedIndex (utilisation de [NSNumber numberWithInt: tabBar.selectedIndex]), puis le lire en arrière et définir la propriété sur le lancement. Peut-être que cela ne répond pas correctement à votre question, mais il pourrait être suffisant pour ce que vous essayez d'atteindre.

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