Создание пользовательского 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 файлы не будут скомпилированы и не будут доступны в вашем проекте.
-
Вы можете явно указать свои файлы раскадровки /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))