Создание пользовательского cocoa pod с раскадрой в нем

Я создаю pod, и в ресурсном комплекте у меня есть раскадровка (локализованная).

Когда я пытаюсь создать экземпляр раскадровки, произошла ошибка: Could not find a storyboard named 'MyStoryboard' in bundle NSBundle. Код выглядит следующим образом:

NSURL *bundleURL = [[NSBundle mainBundle] URLForResource:@"MyBundle" withExtension:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithURL:bundleURL];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyStoryboard" bundle:bundle];

Структура MyBundle выглядит следующим образом:

- MyBundle.bundle
  - Base.lproj
    - MyStoryboard.storyboard
  - es.lproj
    - MyStoryboard.strings

Может ли раскадровка быть включена в комплект в первую очередь?

Я не видел примеров Pod, которые содержат раскадровки. Если вы знаете какие-то стручки, которые делят свою раскадровку, сообщите мне об этом.

Ответы

Ответ 1

Следует иметь в виду две вещи.

  • Вы добавляете свои ресурсы pod через предопределенный пакет, например

    s.resources = ["Resources/Pod.bundle"]
    

в этом случае содержимое вашего пакета будет скопировано в ваш проект xcode без какой-либо дополнительной обработки. Это означает, что раскадровки или xib файлы не будут скомпилированы и не будут доступны в вашем проекте.

  1. Вы можете явно указать свои файлы раскадровки /nib, например

    s.resources = ["Resources/**/*.storyboard"]
    

В этом случае раскадровка будет скомпилирована и будет доступна в вашем проекте. Недостатком этого (в момент написания) является то, что вы не можете использовать локализованные раскадровки, потому что все раскадровки будут обрабатываться и копироваться в корневом расположении вашего пакета. Поэтому раскадровки с таким же именем в разных папках .lproj будут перезаписаны.

Ответ 2

Вы хотите resources. Вот некоторые спецификации, которые включают их:

JCAutocompletingSearch/0.9.2/JCAutocompletingSearch.podspec
JCAutocompletingSearch/0.9.3/JCAutocompletingSearch.podspec
JCAutocompletingSearch/0.9.4/JCAutocompletingSearch.podspec
JCAutocompletingSearch/0.9.5/JCAutocompletingSearch.podspec
JCAutocompletingSearch/0.9.6/JCAutocompletingSearch.podspec
Keystone-Contacts-iOS/1.1.4/Keystone-Contacts-iOS.podspec
LumberjackConsole/2.0.0/LumberjackConsole.podspec
LumberjackConsole/2.0.1/LumberjackConsole.podspec
Mixpanel/2.1.0/Mixpanel.podspec
Mixpanel/2.2.0/Mixpanel.podspec
Mixpanel/2.2.1/Mixpanel.podspec
Mixpanel/2.2.2/Mixpanel.podspec
Mixpanel/2.2.3/Mixpanel.podspec
Mixpanel/2.3.0/Mixpanel.podspec
Mixpanel/2.3.1/Mixpanel.podspec
Mixpanel/2.3.2/Mixpanel.podspec
Mixpanel/2.3.4/Mixpanel.podspec
Mixpanel/2.3.5/Mixpanel.podspec
OpenBLE/1.0.0/OpenBLE.podspec

Ответ 3

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

Вызов

NSString *path = [bundle pathForResource:@"MyStoryboard" ofType:@"storyboard"];
NSLog(@"path: %@",path);

напечатает

/var/mobile/Containers/Bundle/Application/_identifier_/MyApp.app/MyBundle.bundle/Base.lproj/MyStoryboard.storyboard

то есть. сам раскадровка найден, но не загружается "обычным способом".

Ответ 4

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

let bundle = Bundle(for: type(of: self))