在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)