web-dev-qa-db-fra.com

NSBundle pathForResource est NULL

Je crée une application simple avec xcode et objc et j'ai besoin de charger un NSDictionary à partir d'un fichier, mais je ne peux pas obtenir le chemin d'accès au fichier à l'aide de NSBundle:

NSString *l = [[NSBundle mainBundle] pathForResource:@"LoginStatuses" ofType:@"plist"];
NSLog(@"%@", l);

Lorsque j'exécute ce code, j'obtiens ceci:

16/10/2010 10: 42: 42.42 Échantillon [5226: a0f] (null)

Et je ne sais pas pourquoi.

J'ai créé un groupe appelé Resources et là j'ai ajouté le LogingStatuses.plist: res

37
patrick

Voici donc la solution à ce problème après avoir obtenu la source:

Je n'ai pas vraiment fait attention à la capture d'écran publiée, mais la cible est de type "Outil de ligne de commande" ... et puisque ceux-ci n'ont pas de bundle [NSBundle mainBundle] renvoie bien sûr zéro. Il est assez trompeur de dire que Xcode ne se plaint pas qu'il ne peut pas exécuter l'étape "Copy Bundle Resources", il l'ignore silencieusement.

La solution consiste simplement à ajouter une nouvelle cible, de type "Application" afin qu'une application basée sur un bundle soit générée. Cochez ensuite les cases Target Membership pour toutes les sources et ressources de cette nouvelle cible. Les chemins de plist sont alors correctement résolus.

63
DarkDust

J'essayais d'obtenir que mon application iPhone utilise une base de données sqlite par défaut et l'application Darn ne pouvait pas la trouver. Il s'est avéré que je devais m'assurer que le fichier .sqlite était dans la ressource du bundle.

  1. Sélectionnez votre projet
  2. Sélectionnez la cible
  3. Sélectionnez l'onglet Build Phases
  4. Ouvrez la section intitulée "Copier les ressources de l'ensemble"
  5. Faites glisser et déposez votre fichier .sqlite dans cette section.

maintenant, votre application trouvera cette base de données sqlite par défaut.

52
fawsha1

Le fichier est-il vraiment inclus dans la cible (et sera-t-il donc copié dans le bundle)? Il existe deux façons de découvrir/définir cela:

Première façon: faites un clic droit (ou Cmd-clic) sur le fichier, sélectionnez "Get Info". Cliquez ensuite sur l'onglet "Cibles" et assurez-vous que le fichier est vérifié pour la ou les cibles souhaitées.

Deuxième façon: faites un clic droit (ou horloge Cmd) dans le navigateur de projet sur l'en-tête du navigateur de fichiers (il lira probablement "Groupes et fichiers"). Sélectionnez ensuite "Adhésion cible". Vous avez maintenant des cases à cocher à côté de chaque fichier qui peut être membre d'une cible (comme les fichiers .m ou les ressources). Encore une fois, assurez-vous que la case à côté de votre fichier est cochée.

22
DarkDust

Depuis que j'ai googlé ici, je n'ai pas trouvé la réponse, mais je l'ai découverte par moi-même, je vais la laisser ici ...

J'avais 2 fichiers: tray.png et [email protected] pour Retina. Les fichiers ont été ajoutés automatiquement à "Copy Bundle Resources".

Mais:

[[NSBundle mainBundle] pathForResource:@"tray" ofType:@"png"];

n'a pas renvoyé le fichier réellement copié dans le bundle! La raison en était: IDE a créé un fichier TIFF tray.tiff (joint tray.png et [email protected])), donc ... ofType:@"tiff"] aidé!

5
Dmitry Isaev

J'ai rencontré ce problème aujourd'hui avec un projet de ligne de commande.

Heureusement, la solution est simple. Allez simplement dans "Build Phases", cliquez sur "+" et ajoutez une nouvelle phase "Copy Files". Choisissez "Ressources" comme destination et ajoutez tous les fichiers que vous souhaitez utiliser.

Maintenant, vous pouvez toujours utiliser [NSBundle mainBundle] et ça devrait marcher!

2
edwardmp

Mon problème et ma solution sont très similaires à ceux de Dmitriy Isaev. J'ai essayé d'obtenir le chemin d'un fichier xib. Les appels (dans Swift) pathForResource ("monfichier", ofType: "xib") et pathForResource ("myfile.xib", ofType: nil) ont échoué.

La solution consiste à utiliser l'extension "nib" à la place:

pathForResource("myfile", ofType: "nib")
2
Tony

Le nom de fichier est sensible à la casse sur iPad. Vous devez utiliser des lettres minuscules.

0
János