Исключение при загрузке NIB из комплекта - PullRequest
3 голосов
/ 19 января 2012

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

  • Проект содержит пакет CFramework.bundle внутри основного пакета приложения
  • CFramework.bundle содержит GigyaFBPreviewController.xib и изображения, которые он использует, в своем корне
  • GigyaFBPreviewController.m находится в статической библиотеке, на которую ссылается проект

Код:

NSString* bundlePath = [[NSBundle mainBundle] pathForResource:@"CBCFramework" ofType:@"bundle"];
NSBundle* bundle = [NSBundle bundleWithPath:bundlePath];
GigyaFBPreviewController* gigya = [[GigyaFBPreviewController alloc] initWithNibName:@"GigyaFBPreviewController" bundle:bundle];
[self presentModalViewController:gigya animated:YES];

Код выполняется после нажатия кнопки и вылетает на последней строке. GigyaFBPreviewController - это просто UIViewController, и он использует значение по умолчанию initWithNibName: bundle:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 
'Could not load NIB in bundle: 'NSBundle </Users/mjovanovic/Library/Application Support/iPhone Simulator/4.3.2/Applications/A40F8D71-EB88-4EB5-B9D3-CFD330C57F24/socialmediatest.app/CBCFramework.bundle> (not yet loaded)' with name 'GigyaFBPreviewController''
*** Call stack at first throw:
(
    0   CoreFoundation                      0x01ad85a9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x01c2c313 objc_exception_throw + 44
    2   CoreFoundation                      0x01a90ef8 +[NSException raise:format:arguments:] + 136
    3   CoreFoundation                      0x01a90e6a +[NSException raise:format:] + 58
    4   UIKit                               0x00e050fa -[UINib instantiateWithOwner:options:] + 2024
    5   UIKit                               0x00e06ab7 -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] + 168
    6   UIKit                               0x00cbc628 -[UIViewController _loadViewFromNibNamed:bundle:] + 70
    7   UIKit                               0x00cba134 -[UIViewController loadView] + 120
    8   UIKit                               0x00cba00e -[UIViewController view] + 56
    9   UIKit                               0x00cbba3d -[UIViewController viewControllerForRotation] + 63
    10  UIKit                               0x00cb7988 -[UIViewController _visibleView] + 90
    11  UIKit                               0x00f5993c -[UIClientRotationContext initWithClient:toOrientation:duration:andWindow:] + 354
    12  UIKit                               0x00c3181e -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:] + 954
    13  UIKit                               0x00eb9619 -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 1381
    14  UIKit                               0x00cbe65d -[UIViewController presentModalViewController:withTransition:] + 3478
    15  socialmediatest                     0x000027bb -[socialmediatestViewController clicky:] + 283
    etc

Соответствующая информация:

  • Если я беру nib-файл из CFramework.bundle и помещаю его в проект, он работает нормально. Тем не менее, мне нужно в комплекте для распространения со статической библиотекой.
  • Пакет существует внутри .app и вызывает [bundle pathForResource: @ "GigyaFBPreviewController" ofType: @ "xib"] возвращает правильный путь.
  • Если я удалю ссылку на изображение из пера, ничего не изменится. Все изображения обозначены как CFramework \ image.png
  • Сообщение об ошибке (еще не загружено) действительно странное. Я нашел кучу постов, где люди переходили в одно и то же исключение при переходе на Xcode4, но их решения у меня не сработали.

* РЕШЕНИЕ *

xib не был скомпилирован в nib и не мог быть загружен, да. Спасибо Джошуа Вайнбергу за предоставленную в комментариях ссылку ниже!

Ответы [ 2 ]

2 голосов
/ 28 марта 2015

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

  1. Добавьте новую цель, выбрав шаблон с именем bundle в OS X -> Framework & Libraries.

  2. Выберите вновь созданную цель и измените BaseSDK с OSX на новейшую iOS.

  3. Добавьте .xibs, изображения или другие ресурсы, которые вы хотите использовать, из пакета в Фраза сборки -> Копировать ресурсы пакета.

  4. Добавить каркас CoreFoundation в Фразы сборки -> Связать бинарный файл с библиотеками.

  5. Скомпилируйте цель, выбрав iOS Device.

  6. Сохраните вновь созданный комплект из каталога Products в какое-то место.

Теперь скопируйте этот пакет в ваш основной проект. Загрузите пакет, используя следующий код:

NSString *path = [[NSBundle mainBundle] pathForResource:@"BundleName" ofType:@"bundle"];

NSBundle *bundle = [NSBundle bundleWithPath:path];

Теперь вы настроены с новым пакетом.

0 голосов
/ 12 мая 2016

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

У меня была ошибка, когда Project-A создавал подпроект Project-B и включал пакет Project-B-Resources. Project-B построил суб-Project-C, который построил свои собственные Project-C-ресурсы. Ресурсы Project-C были объединены внутри ресурсов Project-B. В Xcode> Фазы сборки> Целевые зависимости - если бы я поместил Project-B-Resources выше Project-B, тогда пакет был бы упакован неправильно. Мне нужно было убедиться, что Project-B указан первым, чтобы убедиться, что он правильно запускает сборку Project-C .....

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

https://developer.apple.com/library/ios/recipes/xcode_help-scheme_editor/Articles/SchemeBuild.html

...