我正在try 制作一个框架,它将Bundle 一个故事板.我已经判断过了,并且创建了.框架包括我的.故事板文件(作为一个.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/)的路径在future 可能会发生变化,不应该依赖于它?
  • 框架的名称可能会更改,但如果不先获得框架的NSBundle,就无法获得产品名称?
  • 框架并不是真正的Bundle 包(?),因此,将它们作为一个Bundle 包装载可能会在future 产生不可预见的后果?

可能还有其他问题,解决上述问题的方法,或者上述问题可能根本不是问题,但我一直没能想到它们.

这个问题可能更适合Code Review人,但我觉得它也适合这里.如果需要把它移到那边,请随意做,或者告诉我go 做.

推荐答案

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

let storyboardName = "StoryboardName"
let storyboardBundle = NSBundle(forClass: self)
let storyboard = UIStoryboard(name: storyboardName, bundle: storyboardBundle)

如果此代码不在static方法中,请使用YourClass.self而不是self.

Example for Swift 3:

let storyboardBundle = Bundle(for: NumberPadViewController.self)
super.init(nibName: "NumberPadViewController", bundle: storyboardBundle)

Swift相关问答推荐

JSON如何解码空对象

数据不会被ARC删除在swift'

在用户将输入保存到SWIFT中的核心数据后,如何创建指向我的应用程序S主页的链接?

SwiftUI - NavigationLink(value:)和navigationDestination不工作

仅当单击UIButton时才调用计时器函数

在数组中查找最大y值的x值

我需要一些关于 SwiftUI 动画的帮助

在SwiftUI中使用ForEach循环来显示字典项的键和值在Form视图中

为什么我的Swift app不能用xcodebuild构建,但是用XCode可以构建?

Swift iOS:确定贝塞尔曲线路径是否与 UIView 框架相交?

自定义碰撞形状出现在错误的位置

deinitialize() 与 deallocate()

关于变量的视图的 SwiftUI 生命周期

任何使 ScrollView 像 List 一样执行更灵活的修饰符?

macOS 守护进程应该由Command Line ToolXcode 模板制作吗?

如何为多个类 Swift 进行扩展

Swift 协议只能设置?

如何从 Swift 中的字符串生成条形码?

如何在 Swift 中将 UILabel 居中?

如何在 SwiftUI 中创建带有图像的按钮?