NSBundle pathForResource имеет значение NULL
Я создаю простое приложение с xcode и objc, и мне нужно загрузить NSDictionary из файла, но я не могу получить путь к файлу с помощью NSBundle:
NSString *l = [[NSBundle mainBundle] pathForResource:@"LoginStatuses" ofType:@"plist"];
NSLog(@"%@", l);
Когда я запускаю этот код, я получаю следующее:
2010-10-16 10: 42: 42.42 Образец [5226: a0f] (null)
И я не знаю почему.
Я создал группу под названием "Ресурсы", и там я добавил LogingStatuses.plist:
![res]()
Ответы
Ответ 1
Итак, вот решение этой проблемы после того, как я получил источник:
На самом деле я не обращал внимания на опубликованный снимок экрана, но цель имеет тип "Инструмент командной строки"... и поскольку у них нет пакета [NSBundle mainBundle]
, конечно, он возвращает nil. Это довольно вводит в заблуждение, что Xcode не жалуется, что он не может выполнить шаг "Копирование ресурсов Bundle", он просто пропускает его.
Решение - это просто добавить новую цель типа "Приложение", чтобы сгенерировано приложение на основе пакетов. Затем установите флажки Target Membership для всех источников и ресурсов для этой новой цели. Пути plist будут правильно разрешены тогда.
Ответ 2
Я пытался заставить мое приложение iPhone использовать базу данных sqlite по умолчанию, и приложение darn не могло найти его. Оказалось, что я должен был убедиться, что файл .sqlite находится в ресурсе связки.
- Выберите свой проект
- Выберите цель
- Выберите вкладку "Фазы построения".
- Откройте раздел "Копирование ресурсов пакета"
- Перетащите файл .sqlite в этот раздел.
теперь ваше приложение найдет эту базу данных sqlite по умолчанию.
Ответ 3
Действительно ли файл включен в цель (и будет ли он скопирован в комплект)? Есть два способа узнать/установить это:
Первый способ: щелкните правой кнопкой мыши (или Cmd-click) в файле, выберите "Получить информацию". Затем перейдите на вкладку "Цели" и убедитесь, что файл отмечен для желаемых целей.
Второй способ: щелкнуть правой кнопкой мыши (или Cmd-clock) в браузере проекта в заголовке браузера файлов (скорее всего, он будет читать "Группы и файлы" ). Затем выберите "Целевое членство". Теперь у вас есть флажки рядом с каждым файлом, который может быть членом целевой (например, файлов или ресурсов .m). Опять же, убедитесь, что флажок рядом с вашим файлом отмечен.
Ответ 4
Так как я искал здесь, не нашел ответа, но потом обнаружил его сам, я оставлю его здесь...
У меня было 2 файла: tray.png и [email protected] для Retina. Файлы были добавлены в "Копировать ресурсы Bundle" автоматически.
Но:
[[NSBundle mainBundle] pathForResource:@"tray" ofType:@"png"];
не вернул файл, фактически скопированный в комплект! Причина: IDE создала один файл TIFF tray.tiff (совлокальный tray.png и [email protected]), поэтому ... ofType:@"tiff"]
помогло!
Ответ 5
Моя проблема и решение очень похожи на Дмитрия Исаева. Я попытался получить путь для xib файла. Оба вызова (в Swift) pathForResource ( "myfile", ofType: "xib" ) и pathForResource ( "myfile.xib", ofType: nil) потерпят неудачу.
Решение состоит в том, чтобы вместо этого использовать расширение "nib":
pathForResource("myfile", ofType: "nib")
Ответ 6
Сегодня я столкнулся с этой проблемой с проектом командной строки.
К счастью, решение легко. Просто перейдите к разделу "Сборка фаз", нажмите "+" и добавьте новую фазу "Копировать файлы". Выберите "Ресурсы" в качестве адресата и добавьте все файлы, которые вы хотите использовать.
Теперь вы можете использовать [NSBundle mainBundle]
, и он должен работать!
Ответ 7
Имя файла чувствительно к регистру iPad. Вам нужно использовать маленькие буквы.
Ответ 8
В моем случае (выполнение XCTestCase) по какой-то причине ресурсы хранились в неосновном Bundle. Я исправил проблему, проверив сначала, к какому классу связки тестов принадлежит:
[[NSBundle bundleForClass:[self class]] pathForResource:@"Config" ofType:@"plist"];
Надеюсь, это может помочь кому-то еще.
Ответ 9
Убедитесь, что вы правильно произнесли имя файла ресурса. Я только что узнал, что это трудно.:)