Ios 在Swift框架中加载资源(例如故事板)
我正在尝试制作一个框架来捆绑一个故事板。我已经检查了,并且创建的.framework包含了我的.storyboard文件(作为Ios 在Swift框架中加载资源(例如故事板),ios,swift,Ios,Swift,我正在尝试制作一个框架来捆绑一个故事板。我已经检查了,并且创建的.framework包含了我的.storyboard文件(作为.storyboard c文件),并且已经获得了在运行时加载故事板的框架。然而,这是一个框架,我希望代码尽可能多用,我觉得我目前的解决方案有点粗糙。目前,我正在使用以下代码加载情节提要: let mainBundlePath: String = NSBundle.mainBundle().resourcePath let frameworkBundlePath = mai
.storyboard c
文件),并且已经获得了在运行时加载故事板的框架。然而,这是一个框架,我希望代码尽可能多用,我觉得我目前的解决方案有点粗糙。目前,我正在使用以下代码加载情节提要:
let mainBundlePath: String = NSBundle.mainBundle().resourcePath
let frameworkBundlePath = mainBundlePath.stringByAppendingPathComponent("Frameworks/AuthenticationManager.framework")
let frameworkBundle = NSBundle(path: frameworkBundlePath)
let storyboard = UIStoryboard(name: "Storyboard", bundle: frameworkBundle)
我注意到有几件事可能会发生:
- 框架的路径(
)在未来可能会发生变化,不应该依赖于此Frameworks/
- 框架的名称可能会更改,但如果不先获取框架的
,就无法获取产品名称NSBundle
- 框架并不是真正的bundle(?),所以将它们作为bundle加载可能会在将来产生不可预见的后果
您可以使用此标识符定位框架,例如:
let frameworkBundle = NSBundle(identifier: "com.duffy.AuthenticationManager")
let storyboard = UIStoryboard(name: "Storyboard", bundle: frameworkBundle)
这里有一个更干净的解决方案(不涉及框架标识符):
如果此代码不在static
方法中,请使用YourClass.self
而不是self
Swift 3示例:
let storyboardBundle = Bundle(for: NumberPadViewController.self)
super.init(nibName: "NumberPadViewController", bundle: storyboardBundle)
对于Swift 3/4,现在只需捆绑:
let bundle = Bundle(identifier: "com.myframework.id")
let storyboard = UIStoryboard(name: "FrameworkMain", bundle: bundle)
这是一种更好的方法,可以在Swift 3中加载捆绑包,而无需传递更可能失败的字符串
let myBundle = Bundle(for: MyViewController.self)
let myStoryboard = UIStoryboard(name: "StoryboardName", bundle: myBundle)
而不是让storyboardBundle=NSBundle(forClass:self),现在它应该是让storyboardBundle=NSBundle(forClass:className.self)@azimov,这要看情况而定。如果它在静态方法中,
self
就足够了。我加了一个小便条,使事情更清楚。谢谢如果此代码是从框架本身中的类中执行的,那么它只是一个更干净的解决方案。如果框架的“消费者”想要访问(并且对各个类的访问控制设置为public),那么接受的答案仍然是可行的。@wuf810您仍然可以在其YourClass.self中使用框架中的类,不是吗?有没有办法从框架内访问应用程序包。使用标识符可能不是可行的方法,因为框架可能不知道应用程序包标识符。@niks:bundle.main
是主要的应用程序包。您好,我知道这个主题已经有4年了。。我想做几乎相同的事情,但我没有找到任何教程或好的例子,所以我可以从中学习。你(或其他人)能帮我吗?只要给我一个提示或一些链接。。非常感谢你,如果你有像R.Swift这样的东西,你可以使用生成的故事板名称来保证编译时的安全
let myBundle = Bundle(for: MyViewController.self)
let myStoryboard = UIStoryboard(name: "StoryboardName", bundle: myBundle)