«Не удалось загрузить NIB в комплекте» из iOS Static Framework

Я создаю статическую инфраструктуру iOS (шаблон по умолчанию в Xcode 6), которая включает файлы xib.

Однако у меня возникают проблемы с загрузкой файлов пера при добавлении моего фреймворка в другое приложение, я получаю следующую ошибку:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </private/var/mobile/Containers/Bundle/Application/89B7C8F1-698A-4E0B-AD8F-4DB414A6001B/Sample.app> (loaded)' with name 'MyNibName''

Я пробовал несколько решений, некоторые из которых описаны здесь< /а>. Я все еще не мог решить проблему.

Я вижу много ссылок на этот популярный проект, который в настоящее время не поддерживается, поскольку xcode имеет встроенная функция. Должен ли я использовать это вместо этого?

В моем целевом фреймворке у меня есть xib-файлы, включенные в фазу сборки «Копировать ресурсы пакета», и я вижу их внутри каталога построенного фреймворка, однако я заметил, что структура созданного фреймворка не соответствует структуре, описанной в документация Apple. Даже когда я изменил структуру фреймворка (используя версии и связывая папки Header и Resources с текущей версией), я все еще не мог решить проблему.

Я пытался загрузить перо следующими способами:

1 загрузка пакета по имени фреймворка, в данном случае это nil

NSString *resourceBundlePath = [[NSBundle mainBundle] pathForResource:@"myframework" ofType:@"framework"];
resourcesBundle = [NSBundle bundleWithPath:resourceBundlePath];
self = [super initWithNibName:@"MyNibName" bundle:resourcesBundle];

2 Создание пакета ресурсов и добавление его в платформу. Также есть nil. Обратите внимание, что это решение работает, если я добавляю пакет в проект отдельно, но это противоречит цели фреймворка.

NSString *resourceBundlePath = [[NSBundle mainBundle] pathForResource:@"resources" ofType:@"bundle"];
resourcesBundle = [NSBundle bundleWithPath:resourceBundlePath];
self = [super initWithNibName:@"MyNibName" bundle:resourcesBundle];

3 Загрузка пакета по классам по-прежнему не работает, однако он возвращает тот же набор приложений, что и в [NSBundle mainBundle]. FrameworkClass — это любой класс, встроенный в фреймворк.

NSBundle* bundle = [NSBundle bundleForClass:[FrameWorkClass class]];  

4 Загрузка основного пакета с [NSBundle mainBundle], который не работает и не должен работать.


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

Что мне не хватает? Кто-нибудь смог использовать шаблон статической структуры по умолчанию в xcode для создания структуры с файлами пера?


person KDaker    schedule 20.02.2015    source источник
comment
Можете ли вы показать код, который вы используете для загрузки пера?   -  person Midhun MP    schedule 20.02.2015
comment
Вы можете использовать: NSBundle* bundle = [NSBundle bundleForClass:[YourFrameWorkClass class]];   -  person Midhun MP    schedule 20.02.2015
comment
Пакетные отпечатки теперь равны нулю? Также проверьте свой фреймворк и проверьте, есть ли там комплект и перо.   -  person Midhun MP    schedule 20.02.2015
comment
@MidhunMP нет, в данном случае это не ноль, это пакет приложений. Вот что я получаю, когда я регистрирую это: </private/var/mobile/Containers/Bundle/Application/01AD75AF-125D-4B40-9757-B901AB6ECDC0/Sample.app>   -  person KDaker    schedule 20.02.2015
comment
да перо в комплекте, только что проверил   -  person KDaker    schedule 20.02.2015
comment
@KDaker Вы нашли решение?   -  person Vladimirs Matusevics    schedule 08.04.2015
comment
@krotov У меня нет. В итоге я не использовал перья, настроив только контроллеры просмотра. посмотрю еще раз, когда будет время   -  person KDaker    schedule 09.04.2015
comment
@KDaker NSBundle * bundle = [NSBundle bundleWithIdentifier:@"com.something.FrameworkName"]; у меня сработало   -  person Vladimirs Matusevics    schedule 10.04.2015
comment
@krotov Я помню, что у меня это не сработало, когда я попробовал. Я должен буду изучить это снова, хотя. Спасибо за предложение!   -  person KDaker    schedule 10.04.2015
comment
@KDaker: Вы нашли решение своей проблемы?   -  person Kushal Ashok    schedule 07.09.2017
comment
@KushalAshok извините за поздний ответ, только что заметил это. Я не нашел решения в то время.   -  person KDaker    schedule 12.03.2018
comment
На всякий случай, если у кого-то все еще есть проблема NSBundle* resourcesBundle = [NSBundle bundleForClass:[self class]]; self = [super initWithNibName:nibNameOrNil bundle:resourcesBundle]; если (я) { } вернуть себя; }   -  person Muhammad Anum    schedule 07.05.2020


Ответы (3)


Это должно загрузить ваш пакет.

Свифт

let frameworkBundleID  = "com.framework.bundleId";
let bundle = Bundle(identifier: frameworkBundleID)

Цель C

NSString* const frameworkBundleID  = @"com.framework.bundleId";
NSBundle* bundle = [NSBundle bundleWithIdentifier:frameworkBundleID];
person Srikanth    schedule 19.03.2015
comment
идеальный и точный ответ, понравилось, отличная работа - person vishal dharankar; 09.07.2015
comment
Это сработало для меня, но не решает проблему, если сторонняя структура (статическая библиотека), которую вы встраиваете в свою библиотеку, ищет ресурсы nib, которые должны находиться в корневой папке их части... - person loretoparisi; 16.02.2016

эта работа для меня:

импортировать логинFramework/ClassA.h

NSBundle* resourcesBundle = [NSBundle bundleForClass:[ClassA class]];
ClassA * class = [[ClassA alloc]initWithNibName:@"ClassA" bundle:resourcesBundle];
UINavigationController * navigation = [[UINavigationController alloc] initWithRootViewController:class];

[self.window setRootViewController:navigation];

в этом случае в делегате приложения и в заголовке Framework добавьте #import "ClassA.h"

если хотите, я могу отправить вам пример

person Lorenzo    schedule 02.03.2015

SWIFT v5

Я создал переменную в файле констант

var frameworkBundle:Bundle? {
    let bundleId = "com.framework.bundleId"
    return Bundle(identifier: bundleId)
}

Затем, когда мне нужно значение пакета, я напрямую передаю его, например

collectionView.register(UINib(nibName: "MyCVCell", bundle: frameworkBundle), forCellWithReuseIdentifier: "MyCVCell")
person Maneesh M    schedule 14.10.2019