web-dev-qa-db-fra.com

pathForResource renvoie null

J'essaie de charger des fichiers .applescript dans mon projet.

Copiez-les dans le répertoire "Supporting Files" comme ceci:

enter image description here

et essayé d'y accéder: 

NSBundle *bundle = [NSBundle mainBundle];
NSLog(@"Resource path for test.applescript: %@", [bundle pathForResource:@"test" ofType:@"applescript"]);

pathForResource renvoie toujours null.

Les deux fichiers sont correctement importés dans xcode. L'adhésion ciblée est mon application . Les solutions de questions similaires n'ont pas vraiment aidé

Qu'est-ce que je fais mal?

40
dvcrn

Dans la cible Xcode "Build Phases", ajoutez le fichier sous "Copy Bundle Resources" ".

145
zaph

Pour tous ceux qui obtiennent encore un chemin nil et le fichier est ajouté dans "Copier les ressources du paquet", supprimez simplement le fichier de Copier les ressources et ajoutez-le à nouveau.

5
Ahmad Ishfaq

Très bonne réponse de Zaph ci-dessus, mais j'ai remarqué que lorsque je le faisais, il y avait un moyen plus rapide, du moins dans Xcode 6.1.

si vous cliquez une fois sur le fichier (par exemple, test.applescript) et ouvrez le menu de droite de Xcode, vous verrez une section intitulée "Adhésion à la cible". Assurez-vous que la bonne cible (comme dans celle avec laquelle vous utilisez le script) est sélectionnée et le même travail sera effectué en ajoutant le fichier sous "Copier les ressources du paquet".

En outre, ce n'est pas tout à fait pertinent, mais dans le cas où vous chargez à partir de plusieurs emplacements différents ou si vous héritez de cette classe. Vous ne devriez pas vraiment utiliser 

[NSBundle mainBundle];

utilisez plutôt 

[NSBundle bundleForClass:[self class]];

Cela signifie que vous n'avez pas à vous soucier de l'endroit où vous vous trouvez dans l'appel de la méthode, il prend la ressource dans les éléments appropriés associés à la cible que vous exécutez. Idéal pour faire des bibliothèques et des appels réutilisables;) 

1
agovan

Votre image suppose-t-elle que ce fichier se trouve dans un dossier?

Essayez la méthode pathForResource:ofType:inDirectory: dans ce cas:

NSLog(@"Resource path for test.applescript: %@", [bundle pathForResource:@"test" ofType:@"applescript" inDirectory:@"folder/Supporting Files");
0
beryllium

En plus de ce que Zaph a dit, assurez-vous que vous ne travaillez pas en mode "Release".

Il fut un temps où j'oubliais de modifier ce réglage et les symboles étaient effacés, rendant ainsi NSBundle incapable de résoudre le problème.

0
Jon