一尘不染

在Swift框架中加载资源(例如,故事板)

swift

我正在尝试制作一个将故事板捆绑在一起的框架。我已经检查过,并且创建的.framework包括我的.storyboard文件(作为.storyboardc文件),并且已经获得了在运行时加载情节提要的框架。但是,这是一个框架,我希望代码尽可能多才多艺,而且我觉得我当前的解决方案有些拙劣。目前,我正在使用以下代码加载情节提要:

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获得产品名称吗?
  • 框架不是真正的捆绑包(?),因此将它们作为捆绑包加载会在将来产生无法预料的后果吗?

可能还有其他问题,上述问题的解决方案,或者上述问题可能毕竟不是问题,但我一直没有想到。

这个问题可能更适合于Code
Review
,但是我觉得在这里也很合适。如果需要将其移至该处,请随意执行此操作或告诉我执行此操作。


阅读 195

收藏
2020-07-07

共1个答案

一尘不染

这是一个更干净的解决方案(不涉及框架标识符):

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)
2020-07-07