Получение нулевого пути от NSBundle

Я создал новую папку в своем проекте, в которую скопировал изображение (названное "io.jpg").
Я также проверил этапы сборки -> скопировал ресурсы пакета, и файл там.
Итак. Я пытаюсь получить путь к этому изображению:

NSBundle* bundle=[NSBundle mainBundle];
NSString* path=[bundle pathForResource: @"io" ofType: @"jpg"];
NSLog(@"%@",path);

Но он печатает (null), я тоже пробовал так:

NSBundle* bundle=[NSBundle mainBundle];
NSString* path=[bundle pathForImageResource: @"io"];
NSLog(@"%@",path);

Но все равно печатает (null).
В чем проблема?


person Ramy Al Zuhouri    schedule 29.07.2012    source источник
comment
Вы смотрели в фактическом построенном продукте, чтобы убедиться, что файл был скопирован правильно?   -  person jtbandes    schedule 29.07.2012
comment
Да, файл находится в каталоге приложения.   -  person Ramy Al Zuhouri    schedule 29.07.2012
comment
возможный дубликат resourcePath не работает Xcode   -  person trojanfoe    schedule 30.07.2012
comment
В этом вопросе нет ответа (флажок target membershit уже установлен), поэтому я не думаю, что это дубликат.   -  person Ramy Al Zuhouri    schedule 30.07.2012
comment
1) Возвращает ли [NSBundle mainBundle] ненулевое значение? 2) вы пробовали вместо этого URLforResource? (Грубое предположение)   -  person Thorsten Karrer    schedule 01.08.2012
comment
вы создали ссылку на папку или группу?   -  person Jessedc    schedule 01.08.2012


Ответы (6)


Я предполагаю, что, учитывая то, что вы сказали, что создали новую папку в своем проекте Xcode, вы создали ссылку на синюю папку, а ваш ресурс изображения находится в подкаталоге вашего пакета.

Я готов поспорить, что это не ошибка с NSBundle, учитывая, насколько стар и важен этот класс для платформы Foundation.

Попробуйте получить доступ к вашему ресурсу, используя более конкретный метод экземпляра.

- (NSString *)pathForResource:(NSString *)name ofType:(NSString *)extension inDirectory:(NSString *)subpath

где subpath – это имя ссылки на папку, которую, как я полагаю, вы создали.

person Jessedc    schedule 01.08.2012

Перейдите к: Цель -> «Фазы сборки» -> «Копировать ресурсы пакета». Затем добавьте этот конкретный файл сюда.

очистить проект и запустить. Оно работает. :)

person seenu    schedule 31.08.2013

Вы получите нулевой путь, если запрашиваемый вами ресурс не существует в выходных данных (или не существует там, где должен). Это действительно единственная причина, которую я видел.

Забудьте о доказательстве того, что он должен существовать, и просто проверьте вывод, чтобы убедиться, что он существует.

(Помните также, что имена файлов чувствительны к регистру.)

Чтобы уточнить, вам следует искать в комплекте вывода в ~/Library/Developer/Xcode/DerviedData/Project-{GUID}/Build/Products. Ваше изображение будет отсутствовать.

person Steven Fisher    schedule 29.07.2012
comment
Изображение есть, я также попытался напечатать путь к пакету, зашел в его каталог и заметил, что в разделе «Содержание-> Ресурсы» есть изображение io.jpg. - person Ramy Al Zuhouri; 29.07.2012
comment
Он должен находиться на верхнем уровне YourApplication.app, а не в подкаталоге Resources. - person Steven Fisher; 01.08.2012
comment
@StevenFisher Я использую Xcode 6 - где я могу увидеть файлы ресурсов? Их нет в продуктах или Debug-iphonesimulator. - person moonman239; 28.07.2015
comment
Индивидуальная графика находится внутри комплекта приложения: нажмите Control, как указано выше. Если вы используете каталоги активов, вы их не увидите; эквивалентом является файл Assets.car. Вам, вероятно, лучше задать новый вопрос со скриншотами ваших изображений (в составе пакета ресурсов/проекта) и кодом, который вы используете, чтобы попытаться получить к ним доступ. Сейчас все по-другому. - person Steven Fisher; 29.07.2015

У меня была такая проблема несколько недель назад. А оказалось, что я просто не поставил галочку. Вот ответ, который я получил, когда спросил.

«Выберите файл в навигаторе проекта Xcode (слева) и убедитесь, что ваша цель отмечена в разделе «Целевое членство» в инспекторе файлов (справа). — Также дважды проверьте написание имен файлов. - Мунди"

person Yep_It's_Me    schedule 30.07.2012
comment
Итак, этот вопрос является дубликатом этого вопроса? - person trojanfoe; 30.07.2012
comment
да. Если вы забудете поставить галочку, файла на самом деле не будет в комплекте приложения. - person Steven Fisher; 30.07.2012

Все это излишне, если вы просто пытаетесь получить изображение. Допустим, вы включили bundleImage.PNG в свой комплект приложений... где-то, как-то...

NSImage *image = [NSImage imageNamed:@"bundleImage"];

обязательно.. найду... Если оно есть... Проще не придумаешь, да?

Если - на всякий случай - это немного более сложная ситуация, например, изображение находится в загружаемом пакете или фреймворке - вы можете использовать код, аналогичный следующему (категория класса в NSImage), который также вернуть ресурс.

+ (id) imageInFrameworkWithFileName:(NSString *) fileName {
   NSBundle *b = [NSBundle bundleForClass: [DummyClass class]];
   return [self imageWithFileName: fileName inBundle: b];
}

Честно говоря, я не очень понимаю концепцию или то, как работает такой «класс-пустышка».. но вот как это выглядит

@interface DummyClass : NSObject
@end
@implementation DummyClass 
@end
person Alex Gray    schedule 01.08.2012
comment
Предполагая, что «DummyClass» также находится в комплекте/фреймворке в качестве ресурса изображения, которое вы ищете. - person Jessedc; 01.08.2012
comment
@Jessedc Нет, я просто включаю @interface DummyClass перед своим @interface NSImage (MyCategory), и тогда я могу использовать его везде, где унаследована эта категория #import.. - person Alex Gray; 01.08.2012

Попробуйте удалить изображение из своего приложения. А затем добавьте его снова. И очистите свою сборку перед ее запуском. Посмотрите, поможет ли это. В противном случае, пожалуйста, сделайте скриншот навигатора вашего проекта, показывающий, где добавлено изображение. Оно должно быть на верхнем уровне. вашего Application.app. Это где-то внутри любой папки/подпапки.

person AJS    schedule 06.08.2012