IPhone SDK: подпапки внутри основного пакета

в текущем проекте у меня есть несколько папок с подпапками, и они содержат изображения: 01.png, 02.png.

Папка1/FolderA/f1.png Folder1/FolderB/F1.png

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

Таким образом, при попытке загрузить изображение это не работает:

NSString * filePath = [[NSBundle mainBundle] pathForResource: @ "f1"           OfType: @ "PNG"            inDirectory: @ "Folder1/FolderA" ];

Но еще более странно, при загрузке изображения "f1" изображение фактически загружает "F1"

UIImageView * imageView = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @ "f1.png" ]];

У кого-нибудь есть идеи о том, как обойти эту проблему?

Есть ли опция компиляции для создания папок в комплекте приложений?

ТИА.

Ответ 1

Чтобы создать подпапки внутри пакета .app, вы должны проверить опцию "Создать ссылки на папки для любых добавленных папок", а не по умолчанию "Рекурсивно создавать группы для любых добавленных папок", Теперь в XCode ваша импортированная папка выглядит синей, а не желтой. Создайте и идите, и вы увидите папки в вашем файле .app.

Ответ 2

Прежде всего папки, которые вы создаете в Xcode, представляют собой просто организационные структуры, не имеющие аналогов на уровне файловой системы. Другими словами, все папки, за исключением папки "Классы", выравниваются на уровне файловой системы. Поэтому, даже если вы поместите свой файл изображения в следующее место в xcode, оно все равно будет существовать на верхнем уровне файловой системы: f1/f2/f3/f4/f5/image.png. Таким образом, в методе pathForResource вы не должны включать аргумент inDirectory.

Что касается второй проблемы, mac osx не распознает имена файлов с учетом регистра. Следовательно, f1 и F1 эквивалентны mac osx и будут ссылаться на один и тот же файл. Это можно легко увидеть, выполнив следующие две команды в терминальном сеансе:

touch f
touch F

вы заметите, что после этого существует только 1 файл: а именно f. Если вы отмените 2 команды, вы все равно получите один файл, но он называется F.

Ответ 3

ennuikiller прав. Я думаю, вы можете организовать свои изображения через Finder в подпапке, а затем обновить местоположение изображения в XCode, щелкнув правой кнопкой мыши изображение и выбрав опцию "Получить информацию". Затем установите новый каталог.

Приветствия.

Ответ 4

Просто хотел добавить ответ Mugunth, чтобы следить за частью оригинального вопроса, который пытался использовать:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"f1" ofType:@"png" inDirectory:@"Folder1/FolderA"];

... для доступа к файлам, добавленным с использованием ссылок на папки. Вышеупомянутый вызов "pathForResouce" будет работать на симуляторах, но не на реальных iPhone (нуль будет возвращен), потому что они, похоже, не распознают подпапки в части "inDirectory" метода. Однако они распознают их в части "pathForResource". Таким образом, способ перефразировать выше, так что он работает на iPhone:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"FolderA/f1" ofType:@"png" inDirectory:@"Folder1"];

Ответ 5

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

CFBundleRef mainBundle = CFBundleGetMainBundle();
CFURLRef url = CFBundleCopyResourceURL(mainBundle, CFSTR("About"), CFSTR("png"), NULL);
UInt8 filePath[PATH_MAX];
CFURLGetFileSystemRepresentation(url, true, filePath, sizeof(filePath));

Я получаю в результате:/Пользователи/iosif/Library/Application Support/iPhone Simulator/6.1/Приложения/33FB4F79-999C-4455-A092-906A75226CDB/Arithmetics.app/About.png