Ошибка получения пути к .plist с использованием [[NSBundle mainBundle] pathForResource - PullRequest
4 голосов
/ 17 ноября 2009

Я - собеседник в Objective C, и я не знаю достаточно, чтобы объяснить следующую проблему.

Этот код работает:

NSString *plistPath = @"/Users/andrewf/MyApp/Resources/Plates.plist";
dicPlates = [[NSDictionary alloc] initWithContentsOfFile:plistPath];

Мой объект словаря загружается со значениями, как и ожидалось.

Этот код не работает:

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Plates" ofType:@"plist"];
dicPlates = [[NSDictionary alloc] initWithContentsOfFile:plistPath];

plistPath возвращается со значением nil. Это имеет место независимо от того, включаю ли я в вызов inDirectory: @ "Resources" или нет. Все примеры, которые я нашел, не включают inDirectory при попытке открыть файл .plist в каталоге Resources.

Я подтвердил, что файл существует в правильном месте, и даже создал его заново.

Это кажется такой простой проблемой, но я озадачен. Пожалуйста, помогите.

Ответы [ 3 ]

12 голосов
/ 17 ноября 2009

Я думаю, вы не понимаете, куда смотрит pathForResource:.

Это работает:

NSString *plistPath = @"/Users/andrewf/MyApp/Resources/Plates.plist";

Обратите внимание, что этот путь не указывает на ваше приложение. Он указывает на каталог вашего проекта. Предполагается, что ваш plist будет @/Users/andrewf/MyApp/build/Release/MyApp.app/Resources/Plist.plist" (для приложения для iPhone это будет другое, больше похоже на @"/Users/andrewf/Library/Application Support/iPhone Simulator/User/Applicatons/(unique id)/MyApp.app/Resources/Plates.plist"), и именно внутри папки Ресурсы вашего приложения находится pathForResource:.

Это означает, что ваш ресурс не находится в фазе «Копировать ресурсы комплекта» вашей цели сборки. Вам нужно перетащить его из области групп и файлов внутрь этой фазы.

3 голосов
/ 17 ноября 2009

Я нашел проблему!

.plist файл был включен в цель правильно.

Когда изначально создавался .plist, я назвал файл "plate.plist". Сразу после создания файла я переименовал его в «Plates.plist», и это то, что я использовал отныне.

Несмотря на то, что файл был назван «Plates.plist» в моей папке ресурсов, в целевом разделе и в расположении iPhone Simulator, упомянутом выше, файл был назван «пластин.плист». Любопытно, что содержимое файла по-прежнему корректно обновлялось.

Теперь, когда я изменил код так, чтобы он ссылался на "plate.plist", и переименовал файл в папке «Ресурсы» в этот же файл, все работает. Я могу только предположить, что это ошибка в iPhone SDK.

0 голосов
/ 17 ноября 2009

Убедитесь, что файл plates.plist был добавлен к цели в Xcode.

Если файл не добавлен к цели, он не будет находиться внутри продукта сборки, и NSBundle не найдет его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...