2010-09-20 7 views
2

J'essaie d'enregistrer un NSMutableArray appelé queueArray afin qu'il puisse être chargé à nouveau après que l'application a été fermée. J'ai utilisé quelques tutoriels pour me lancer et c'est le code que j'ai trouvé. Le problème semble être que "initWithCoder" et "encodeWithCoder" ne sont pas appelés, montrés par aucun NSLog appels et aucun arrêt aux points d'arrêt. J'ai ajouté le protocole NSCoding au fichier .h et je sais que queueArray n'est pas nul et il contient MPMediaItem s. Voici le code que j'utilise pour essayer de sauvegarder et charger le tableau:iOS/iPhone SDK: initWithCoder et encodeWithCoder ne sont pas appelés

-(IBAction)saveQueuePressed { 

    NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *filePath = [rootPath stringByAppendingPathComponent:@"queueArray.archive"]; 

    //should cause encodeWithCoder to be called 
    [NSKeyedArchiver archiveRootObject:queueArray toFile:filePath]; 

} 

-(IBAction)loadQueuePressed { 

    NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *filePath = [rootPath stringByAppendingPathComponent:@"queueArray.archive"]; 

    //should cause initWithCoder to be called 
    queueArray = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath]; 

} 

-(void)encodeWithCoder:(NSCoder *)coder { 

    NSLog(@"encodeWithCoder"); 

    [coder encodeObject:queueArray forKey:@"savedQueueArray"]; 
} 



-(id)initWithCoder:(NSCoder *)decoder { 

    NSLog(@"initWithCoder"); 

    queueArray = [decoder decodeObjectForKey:@"savedQueueArray"]; 

    return self; 

} 

Toute aide sera grandement appréciée!

+0

Utilisez le "101010 "bouton pour mettre en forme le code. –

Répondre

1

Les méthodes encodeWithCoder: et initWithCoder sont appelées lorsque vous archivez/désarchivez un objet qui y répond. D'après ce que je comprends, vous avez ces méthodes dans votre classe, mais l'objet que vous archivez réellement (queueArray) n'est pas une instance de cette classe, c'est un NSMutableArray.

Si vous souhaitez enregistrer votre objet entier, vous pouvez changer votre méthode de saveQueue à ce

-(IBAction)saveQueuePressed { 

    NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *filePath = [rootPath stringByAppendingPathComponent:@"queueArray.archive"]; 

    // saving the array shouldn't, but saving the self object 
    //should cause encodeWithCoder to be called: 
    [NSKeyedArchiver archiveRootObject:self toFile:filePath]; 
} 

Mais si vous voulez juste enregistrer le tableau, je suppose que vous pouvez simplement utiliser saveQueuePressed et loadQueuePressed, je Ne pensez pas que vous avez besoin des méthodes encode/init WithCoder:

Mise à jour: Peut-être que votre chemin n'est pas correct. Essayez

NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
NSString *filePath = [[rootPath stringByAppendingPathComponent:@"queueArray.archive"] stringByExpandingTildeInPath]]; 
+0

J'ai changé le code pour: // enregistrer NSString * rootPath = [NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex: 0]; NSString * filePath = [NSString stringWithFormat: @ "% @/queueArrayFile", chemin_racine]; \t [queueArray writeToFile: filePath atomiquement: NO]; // pour récupérer NSMutableArray * retrievedArray = [[NSMutableArray alloc] initWithContentsOfFile: filePath]; \t Cependant, il ne fonctionne toujours pas car le tableau est vide lorsque je le récupère. Je ne pense pas que je suis capable de sauvegarder un MSMutableArray complet de MPMediaItems. Que devrais-je faire? – Craig

+0

peut-être que le chemin n'est pas bon? – filipe

0

Filipe est bon! Votre commentaire dit que vous n'avez toujours pas utilisé sa méthode.

J'ai eu ce problème aussi. Passer de la méthode d'écriture atomique du dictionnaire à keyedArchiver l'a corrigé, heureusement je n'avais qu'à changer une chose, la ligne qui disait writeToFile: est maintenant la fonction d'archivage.

Maintenant, mon programme fonctionne. Pour une raison quelconque, même en répondant à NSCoding, l'objet personnalisé n'est pas codé et casse mon dictionnaire. Est-ce un bug avec iOS? J'ai lu un bon nombre de manuels Apple, mais j'ai aussi vu un bon nombre de fautes de frappe et d'informations manquantes (par exemple, essayez les fonctions MKMapRect sans les vidéos pour les expliquer), ou Core Animations faisant référence à la boucle d'exécution avant d'apprendre enfilage, je pourrais continuer, des phrases à moitié finies dans Quartz ... alors oui, j'ai lu les manuels et cela me laisse perplexe, nous devons obtenir un SDK iOS plus ouvert à un moment donné, j'espère

Questions connexes