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

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

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

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 файлы, включенные в фазу сборки Copy Bundle Resources, и я вижу их внутри встроенного каталога фреймворка, однако я заметил, что структура созданной структуры не соответствует структуре, описанной в документация к яблоку. Даже когда я изменил структуру структуры (используя версии и привязывая папки 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, чтобы создать фреймворк с файлами nib?

Ответ 1

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

NSString* const frameworkBundleID  = @"com.framework.bundleId";
NSBundle* bundle = [NSBundle bundleWithIdentifier:frameworkBundleID];

Ответ 2

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

import loginFramework/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 add  #import "ClassA.h"

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

Ответ 3

SWIFT v5

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

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

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

collectionView.register(UINib(nibName: "MyCVCell", bundle: frameworkBundle), forCellWithReuseIdentifier: "MyCVCell")