我正在尝试创建一个捆绑故事板的框架.我已经检查过,创建的.framework包含我的.storyboard文件(作为.storyboardc文件),并且已经获得了在运行时加载故事板的框架.然而,这是一个框架,我希望代码尽可能多样化,我觉得我目前的解决方案有点hacky.目前,我正在使用以下代码加载故事板:
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)
Run Code Online (Sandbox Code Playgroud)
我注意到的一些事情可能是:
Frameworks/)的路径可能会在未来发生变化,而不应该依赖它?NSBundle框架,就无法获得产品名称?可能还有其他问题,上述问题的解决方案,或者上述问题可能不是问题,但我无法想到它们.
这个问题可能更适合Code Review,但我觉得它也适合这里.如果它需要移动到那里,请随意这样做或告诉我这样做.
Mar*_*n R 53
框架(从"Cocoa Touch Framework"模板创建)具有包标识符,该标识符存储在生成的框架包的Info.plist中.
捆绑标识符在常规目标设置中配置.默认情况下,它是<organization prefix>.<framework name>.
您可以使用此标识符找到框架,例如:
let frameworkBundle = NSBundle(identifier: "com.duffy.AuthenticationManager")
let storyboard = UIStoryboard(name: "Storyboard", bundle: frameworkBundle)
Run Code Online (Sandbox Code Playgroud)
Rud*_*vič 35
这是一个更清洁的解决方案(不涉及框架标识符):
let storyboardName = "StoryboardName"
let storyboardBundle = NSBundle(forClass: self)
let storyboard = UIStoryboard(name: storyboardName, bundle: storyboardBundle)
Run Code Online (Sandbox Code Playgroud)
如果此代码不在static方法内,请使用YourClass.self而不是self.
Swift 3的示例:
let storyboardBundle = Bundle(for: NumberPadViewController.self)
super.init(nibName: "NumberPadViewController", bundle: storyboardBundle)
Run Code Online (Sandbox Code Playgroud)
对于Swift 3/4,它现在只是Bundle:
let bundle = Bundle(identifier: "com.myframework.id")
let storyboard = UIStoryboard(name: "FrameworkMain", bundle: bundle)
Run Code Online (Sandbox Code Playgroud)
这是在Swift 3中加载捆绑软件的更好方法,而无需传递很可能失败的字符串
let myBundle = Bundle(for: MyViewController.self)
let myStoryboard = UIStoryboard(name: "StoryboardName", bundle: myBundle)
Run Code Online (Sandbox Code Playgroud)