2009-12-27 3 views
0

J'ai passé trop de temps à essayer de comprendre ce qui ne va pas, alors j'espère que quelqu'un peut m'aider.Besoin d'aide avec iphone sdk: ne pas enregistrer correctement .plist au répertoire de documents

Mon code:

- (IBAction)fedDog { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"dogsFedDays.plist"]; 
    NSMutableArray *dogsFedSave = [[NSMutableArray alloc] arrayWithCapacity: 48]; 
    for (int i = 0; i < 48; i++) { 
     NSDictionary *myDict = [[NSDictionary alloc] initWithObjectsAndKeys: 
           date[i], @"string", 
           fed[i], @"Yes", 
           nil]; 
     [dogsFedSave addObject:myDict]; 
     [myDict release]; 
    } 
    if (![dogsFedSave writeToFile:path atomically:YES]) 
     NSLog(@"not successful in completing this task"); 
} 

J'ai connecté l'action à un bouton, mais lorsque le bouton est enfoncé, le gel du simulateur, et aucun fichier apparaît dans le répertoire Documents.

+0

n » t posez des questions sur deux problèmes indépendants dans une question – hop

Répondre

0

Il est possible que le simulateur gèle en raison d'une exception non gérée. Vérifiez la console de débogage pendant que votre application est en cours d'exécution. La raison la plus probable pour laquelle votre application est bloquée est que le bouton enfoncé appelle la méthode fedDog:. Essayez de changer votre signature de la méthode à celle-ci:

- (IBAction)fedDog:(id)sender { 
    // your code 
} 
+0

le but entier est que fedDog: est appelé, non? de toute façon, la mauvaise signature ne provoquerait pas réellement une exception. – hop

+0

@hop: Eh bien, en fait, ce serait. Cela déclencherait une exception "sélecteur non reconnu envoyé à l'instance ...". Seule la vérification explicite si l'instance donnée répond à fedDog ou à fedDog: empêcherait l'exception d'être levée. Bien que, dans ce cas particulier, votre argument sur arrayWithCapacity soit une cause plus probable du problème. Je ne l'ai pas remarqué plus tôt. –

+0

désolé, j'ai raté le colon là-bas, la nuit dernière! tu as raison, bien sûr! – hop

0

Pour commencer, votre méthode d'action doit prendre un seul argument plutôt que rien. Au-delà, l'avez-vous exécuté dans le débogueur?

+0

IBActions peut avoir un argument, ou aucun. Autant que je sache, les deux sont valides. –

0

Vous essayez d'envoyer arrayWithCapacity à une instance de NSMutableArray, mais il est en fait déclarée comme

+ (id)arrayWithCapacity:(NSUInteger)numItems 

et donc une méthode de classe.

Il faut donc utiliser soit

NSMutableArray *dogsFedSave = [[NSMutableArray alloc] initWithCapacity:48]; 

ou

NSMutableArray *dogsFedSave = [NSMutableArray arrayWithCapacity:48]; 

Ce dernier serait mieux, car il en résulte un objet autoreleased (et vous avez oublié de libérer dogsFedSave de toute façon ...)

+0

Ok. J'ai mis "+ (id) arrayWithCapacity: (NSUInteger) numItems " dans le fichier d'en-tête. Une chose que j'ai remarquée, (que je ne pense pas que le nouveau code a causé) est qu'il y a 4 avertissements au bas du fichier de classes. 1) implémentation incomplète de la classe "feeddogviewcontroller" 2) définition de la méthode pour + arraywithcapacity non trouvée 3) implémentation incomplète de la classe feeddogviewcontroller (encore) 4) définition de la méthode pour -fedDog non trouvée. Si vous avez une idée de la raison pour laquelle je reçois ces avertissements, s'il vous plaît faites le moi savoir. Merci! – Yogi

+0

pourquoi voudriez-vous faire ça ??? – hop

+0

Je pense que je suis un peu confus. Où est le "+ (id) arrayWithCapacity: (NSUInteger) numItems" censé aller? – Yogi

Questions connexes