Ссылка на файл пера в подпапке пакета приложений Cocoa, скомпилированного в Xcode.
-
05-09-2019 - |
Вопрос
Если у меня есть каталог в моем проекте Xcode (не группа), который добавляется к основной цели и скомпилируется, как мне поручить NSViewController initWithNibName:bundle:
файл пера внутри этого каталога?
я пробовал [viewController initWithNibName:@"FolderName/NibName" bundle:nil]
, но это не работает.Ни один из них не обходится без имени папки и установки параметра пакета в значение [NSBundle mainBundle]
.Я даже пробовал установить пакет на [NSBundle bundleWithPath:pathToFolderName]
но безрезультатно.
Решение
Лучше не использовать такие папки.Многие удобства Cocoa, такие как -[NSImage imageNamed:] или метод инициализации контроллера представления, ожидают найти файл в папке «Ресурсы» пакета.
Если вы все равно действительно хотите сохранить папку с файлами NIB, вы можете это сделать, но вы не сможете использовать удобные методы.Вы можете переопределить метод -[NSViewController loadView] вашего контроллера представления, чтобы вызвать -[NSBundle loadNibFile:externalNameTable:withZone:].Вы должны передать путь к файлу NIB, таблицу имен с NSNibOwner, установленным для контроллера представления, и NULL-зону.Вам также необходимо позаботиться об освобождении объектов верхнего уровня из файла NIB.
Все пойдет намного проще, если вы откажетесь от подкаталогов в Resources.
Другие советы
Другой вариант — создать «Сценарий запуска», который будет выполняться в конце ваших «Фаз сборки», который мог бы копировать ваши файлы *.xib из негруппового каталога в основной пакет.Вам нужно будет не только скопировать файлы xib, но и скомпилировать их в файлы *.nib, используя команду ibtool
команда.Ниже приведен пример моего сценария, который я использую:
# For some reason the tilde is causing problems with find
# so I am replacing the tilde with /Users/whoami
user=`whoami`
# We will find all non-nib files in this directory and copy them into the main bundle
find -L ${LW_ISHARE_PLATFORM_SRC/\~/\/Users\/$user}/lw-ishare-platform-nibs -type f -not -name ".*" -not -name "*.xib" | xargs -t -I {} cp {} ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/
export IBC_MINIMUM_COMPATIBILITY_VERSION=${IPHONEOS_DEPLOYMENT_TARGET}
#setenv PATH "/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
export XCODE_DEVELOPER_USR_PATH="/Developer/usr/bin/"
# Now compile all xib files into nib files
for each in `find -L ${LW_ISHARE_PLATFORM_SRC/\~/\/Users\/$user}/lw-ishare-platform-nibs -type f -name "*.xib"`
do
prefix=`basename "${each}" .xib`
${XCODE_DEVELOPER_USR_PATH}/ibtool --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/${prefix}.nib ${each} --sdk ${SDKROOT}
done
exit 0
$LW_ISHARE_PLATFORM_SRC
для меня это глобальная переменная XCode, и я помещаю все свои *.xib и связанные ресурсы в $LW_ISHARE_PLATFORM_SRC/lw-ishare-platform-nibs
каталог.
${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}
это путь к вашему «основному пакету».