2010-05-16 10 views
0

EDIT: J'ai l'impression d'avoir trouvé quelque chose qui m'a aidé. J'ai conservé la "pile" ivar et maintenant il semble fonctionnerNSCoding Sérialisation de l'iPhone NavigationController stack

J'ai sérialisé plusieurs classes NSObject personnalisées sans problème. Maintenant, je voudrais sérialiser ma pile NavigationController. Chaque viewController n'a besoin que de quelques propriétés enregistrées pour reconstruire l'arborescence de navigation. J'ai implémenté le protocole NSCoding dans les viewControllers, et les ai codés avec succès dans NSData et sauvegardés sur le disque.

Lorsque je tente de charger la pile, le tableau qui en résulte a le nombre correct d'objets, mais je continue à obtenir des erreurs EXC_BAD_ACCESS lorsque j'essaie de définir le tableau viewController. Est-ce que je vais juste à ce sujet dans le mauvais sens?

//AppDelegate.m 
-(void) loadDataFromDisk { 
    NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *programDataPath = [libraryPath stringByAppendingPathComponent:@"programData.dat"]; 
    NSData *programData = [[NSData alloc] initWithContentsOfFile:programDataPath]; 
    NSKeyedUnarchiver *decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:programData]; 
    //stack is a mutable array declared in header 
    //stack = [decoder decodeObjectForKey:@"stack"]; 
     stack = [[decoder decodeObjectForKey:@"stack"]retain]; //retain fixes? Seems to work 
    [decoder release]; 
} 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    // Override point for customization after app launch  
    [window addSubview:[navigationController view]]; 
    [window makeKeyAndVisible]; 
    NSLog(@"%@",self.navigationController.viewControllers); 
    if ([stack count] > 1) { 
      self.navigationController.viewControllers = stack; 
      [stack release]; //retained earlier 
    } 
    return YES; 

}

Répondre

0

je dû -retain la pile de viewController après le chargement du disque. Évidemment, si vous n'assignez pas immédiatement les données à une propriété conservée, elle disparaît.