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


person patrick    schedule 16.10.2010    source источник


Ответы (9)


Итак, вот решение этой проблемы после того, как я получил исходный код:

Я действительно не обратил внимания на опубликованный снимок экрана, но цель относится к типу «Инструмент командной строки» ... и, поскольку у них нет пакета, [NSBundle mainBundle], конечно, возвращает nil. Довольно вводит в заблуждение то, что Xcode не жалуется на то, что не может выполнить шаг «Копировать ресурсы пакета», он просто молча его пропускает.

Решение состоит в том, чтобы просто добавить новую цель типа «Application», чтобы было создано приложение на основе пакета. Затем установите флажки Целевое членство для всех источников и ресурсов для этой новой цели. После этого пути к списку файлов будут правильно разрешены.

person DarkDust    schedule 16.10.2010
comment
Я также использую тип проекта Command-line Tool, и мне не удается загрузить файл из NSBundle pathForResource. Стоит ли переключиться на тип проекта Cocoa Application? Я не уверен, что следую вашему предложению о добавлении новой Application цели; вы имеете в виду добавить новую цель в существующий проект инструмента командной строки? - person raffian; 24.09.2012
comment
Да, я хотел добавить новую цель (типа Application) в ваш существующий проект. Обычный инструмент командной строки - это просто исполняемый файл без пакета. Любые ресурсы, которые вы добавляете в цель Command-line Tool, просто игнорируются (но Xcode не предупреждает вас об этом). - person DarkDust; 24.09.2012
comment
Цели инструмента командной строки по-прежнему могут связывать файлы с помощью NSBundle pathForResource. Вам нужно указать приложению, чтобы оно копировало файл (ы) в каталог продуктов при его сборке. Перейдите на вкладку «Build Phases», нажмите «Add Build Phase» и выберите «Add Copy Files». Затем просто перетащите нужный файл (ы). - person capikaw; 20.08.2013
comment
отличный ответ @DarkDust - person Jagveer Singh; 10.09.2015

Я пытался заставить мое приложение для iPhone использовать базу данных sqlite по умолчанию, но чертовски приложение не могло ее найти. Оказалось, что мне нужно было убедиться, что файл .sqlite находится в ресурсе пакета.

  1. Выбери свой проект
  2. Выбрать цель
  3. Выберите вкладку Build Phases.
  4. Откройте раздел «Копировать ресурсы пакета».
  5. Перетащите ваш файл .sqlite в этот раздел.

теперь ваше приложение найдет эту базу данных sqlite по умолчанию.

person fawsha1    schedule 04.09.2012
comment
Я обнаружил, что Xcode автоматически добавляет определенные типы файлов на этап копирования ресурсов пакета и не учитывает другие. Например, файлы .html (вместе с .strings, .png и т. Д.) Добавляются автоматически, а файлы .js - нет. - person dave; 06.08.2014
comment
Добавьте в список, что xcode не делает автоматически файлы .epub - person okysabeni; 20.06.2015
comment
Xcode также не включает сценарии оболочки в ресурсы автоматически. - person sparkonhdfs; 09.08.2016
comment
Это работает, если я создаю свой проект с использованием Xcode, но не использую swift build. Любое решение? - person Jay Wong; 09.02.2018
comment
@ JayWong4 Что происходит при использовании команды сборки? Вы получаете сообщение об ошибке? - person fawsha1; 09.02.2018

Действительно ли файл включен в цель (и будет ли поэтому скопирован в пакет)? Есть два способа узнать / установить это:

Первый способ: щелкните файл правой кнопкой мыши (или нажмите Cmd) и выберите «Получить информацию». Затем щелкните вкладку «Цели» и убедитесь, что файл отмечен для желаемой цели (целей).

Второй способ: щелкните правой кнопкой мыши (или Cmd-clock) в обозревателе проекта заголовок обозревателя файлов (скорее всего, он будет читать «Группы и файлы»). Затем выберите «Целевое членство». Теперь у вас есть флажки рядом с каждым файлом, который может быть членом цели (например, файлы .m или ресурсы). Опять же, убедитесь, что установлен флажок рядом с вашим файлом.

person DarkDust    schedule 16.10.2010
comment
спасибо за ответ, но похоже, что файлы добавлены в цель - ›grab.by/6TG4 - person patrick; 16.10.2010
comment
@Patrick: Ваша цель называется MetwitApi ... означает ли это, что вы используете этот пакет в каком-то другом приложении? Если так, то mainBundle было бы неправильно ... вместо этого попробуйте bundleForClass:[SomeClassFromApi class]. - person DarkDust; 16.10.2010
comment
это то же самое :( Хочешь, я могу отправить тебе проект xcode. - person patrick; 16.10.2010
comment
Обычно я этого не делаю, но ладно. Вы можете найти мой адрес электронной почты внизу моей домашней страницы. - person DarkDust; 16.10.2010
comment
@ Патрик: Несколько слов об этикете. Люди добровольно проводят свое время на сайтах и ​​в списках рассылки, чтобы помочь сообществу не меньше, чем отдельным лицам. Это не поможет будущим посетителям сайта, которые найдут ваш вопрос, потому что у них были те же проблемы, когда вы публикуете публично, а затем переводите вещи в автономный режим. Также считается дурным тоном цепляться за человека, который в одиночку помогает вам справиться с вашей проблемой. Позвольте сообществу помочь, сохраняя вопросы и ответы в сообществе. Так вы заработаете хорошую репутацию и поможете помощникам сделать то же самое. - person Joshua Nozzi; 16.10.2010
comment
+1 для этого - вместо создания нового целевого приложения я предпочитаю добавлять существующий файл в основной пакет приложения. - person Marcel Falliere; 06.12.2010
comment
Мне помогла именно эта строка вашего ответа. Действительно ли файл включен в цель? Спасибо! - person Hamed Rajabi; 06.05.2012

Так как я погуглил здесь, не нашел ответа, но потом обнаружил его сам, оставлю здесь ...

У меня было 2 файла: tray.png и [email protected] для Retina. Файлы были добавлены в «Копирование ресурсов пакета» автоматически.

Но:

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

не вернул файл, фактически скопированный в бандл! Причина заключалась в следующем: среда IDE создала один файл TIFF tray.tiff (объединенный tray.png и [email protected]), поэтому ... ofType:@"tiff"] помог!

person Dmitry Isaev    schedule 01.03.2013
comment
Чтобы отключить это, есть параметр сборки Combine high resolution artwork / COMBINE_HIDPI_IMAGES. - person Klaas; 09.07.2015

Моя проблема и решение очень похожи на проблемы Дмитрия Исаева. Я попытался получить путь к файлу xib. Оба вызова (в Swift) pathForResource («myfile», ofType: «xib») и pathForResource («myfile.xib», ofType: nil) не выполняются.

Решение состоит в том, чтобы вместо этого использовать расширение «перо»:

pathForResource("myfile", ofType: "nib")
person Tony    schedule 10.05.2015

Я столкнулся с этой проблемой сегодня в проекте командной строки.

К счастью, решение простое. Просто перейдите в «Фазы сборки», нажмите «+» и добавьте новую фазу «Копирование файлов». Выберите «Ресурсы» в качестве места назначения и добавьте любые файлы, которые хотите использовать.

Теперь вы все еще можете использовать [NSBundle mainBundle], и он должен работать!

person edwardmp    schedule 16.05.2016
comment
Это решило мою проблему после обновления до Xcode 8.1. *** Предупреждение: нет инструментов командной строки для Xcode 8.1 при установке под OS X 10.1.66. - person Ed of the Mountain; 31.10.2016
comment
у меня тоже работает. но мне интересно, 1) это чисто? У меня уже есть этап копирования файла. 2) не было бы чище создать еще один пакет (Resource.bundle), поместить туда все ресурсы и связать CLP с resource.bundle? - person Kasper; 18.10.2018

В моем случае (выполнение XCTestCase) по какой-то причине ресурсы хранились в неосновном Bundle. Я исправил проблему, сначала проверив, к какому классу теста принадлежит пакет:

[[NSBundle bundleForClass:[self class]] pathForResource:@"Config" ofType:@"plist"];

Надеюсь, это поможет и кому-то другому.

person Mateusz Wlodarczyk    schedule 01.10.2019

Имя файла на iPad чувствительно к регистру. Вам нужно использовать маленькие буквы.

person János    schedule 08.05.2011
comment
Ну и корпус последовательный. Не обязательно «маленький», но да. Это было проблемой для меня. :) - person Ev.; 10.03.2015

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

person gonzobrains    schedule 17.08.2011