Проблема с получением пути к .plist с использованием [[NSBundle mainBundle] pathForResource

Я новичок в 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.

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

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


person andrewdotcoza    schedule 17.11.2009    source источник
comment
Является ли каталог /MyApp в рабочем примере пакетом для встроенного приложения или каталогом проекта?   -  person TechZen    schedule 17.11.2009


Ответы (3)


Я думаю, вы не понимаете, куда смотрит 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: ищет его в папке "Ресурсы" вашего приложения.

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

person Dave DeLong    schedule 17.11.2009
comment
+1, если Xcode его не видит, то, скорее всего, его не будет в каталоге ресурсов для симулятора, если только вы не поместите его вручную в правильную папку для MyApp.app. - person jrtc27; 26.04.2010

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

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

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

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

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

person andrewdotcoza    schedule 17.11.2009
comment
Это нечувствительная к регистру проблема. Старый .plist не удаляется, если вы просто измените регистр имени файла без изменения содержимого файла. Чтобы решить эти проблемы в будущем, выполните очистку, а затем повторную сборку. - person Matt Gallagher; 18.11.2009

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

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

person TechZen    schedule 17.11.2009