在Swift框架中加载资源(例如情节提要)
我正在试图制作一个捆绑故事板的框架。 我已经检查过了,创build的.framework包含了我的.storyboard文件(作为.storyboardc
文件),并且已经获得了在运行时加载故事板的框架。 然而,这是一个框架,我希望代码尽可能多样化,我觉得我目前的解决scheme是有点哈克。 目前,我正在使用以下代码加载故事板:
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/
)的path有可能在将来改变,而不应该依赖? - 框架的名称可能会改变,但是如果没有获得框架的
NSBundle
,就没有办法获得产品名称? - 框架并不是真正的捆绑(?),因此将它们加载成捆绑可能在将来有不可预见的后果?
可能还有其他的问题,解决上述问题,或者上述问题毕竟可能不是问题,但是我一直没有想到。
这个问题可能更适合Code Review ,但是我觉得它也适用于这里。 如果需要搬到那里,请随时这样做或告诉我这样做。
这是一个更干净的解决scheme(不涉及框架标识符):
let storyboardName = "StoryboardName" let storyboardBundle = NSBundle(forClass: self) let storyboard = UIStoryboard(name: storyboardName, bundle: storyboardBundle)
如果此代码不在static
方法中,请使用YourClass.self
而不是self
。
Swift 3的示例:
let storyboardBundle = Bundle(for: NumberPadViewController.self) super.init(nibName: "NumberPadViewController", bundle: storyboardBundle)
一个框架(由“Cocoa Touch Framework”模板创build)有一个bundle标识符,存储在生成的框架bundle的Info.plist中。
软件包标识符是在通用目标设置中configuration的。 默认情况下,它是<organization prefix>.<framework name>
。
您可以使用此标识符find框架,例如:
let frameworkBundle = NSBundle(identifier: "com.duffy.AuthenticationManager") let storyboard = UIStoryboard(name: "Storyboard", bundle: frameworkBundle)
对于Swift 3/4,现在简单的捆绑:
let bundle = Bundle(identifier: "com.myframework.id") let storyboard = UIStoryboard(name: "FrameworkMain", bundle: bundle)
这是在Swift 3中加载bundle的好方法,而不需要传递更可能失败的string
let myBundle = Bundle(for: MyViewController.self) let myStoryboard = UIStoryboard(name: "StoryboardName", bundle: myBundle)