Подтвердить что ты не робот

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

4b9b3361

Ответ 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

Убедитесь, что вы правильно произнесли имя файла ресурса. Я только что узнал, что это трудно.:)