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

Ios 在Swift框架中加载资源(例如故事板),ios,swift,Ios,Swift,我正在尝试制作一个框架来捆绑一个故事板。我已经检查了,并且创建的.framework包含了我的.storyboard文件(作为.storyboard c文件),并且已经获得了在运行时加载故事板的框架。然而,这是一个框架,我希望代码尽可能多用,我觉得我目前的解决方案有点粗糙。目前,我正在使用以下代码加载情节提要: let mainBundlePath: String = NSBundle.mainBundle().resourcePath let frameworkBundlePath = mai

我正在尝试制作一个框架来捆绑一个故事板。我已经检查了,并且创建的.framework包含了我的.storyboard文件(作为
.storyboard c
文件),并且已经获得了在运行时加载故事板的框架。然而,这是一个框架,我希望代码尽可能多用,我觉得我目前的解决方案有点粗糙。目前,我正在使用以下代码加载情节提要:

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
    ,就无法获取产品名称
  • 框架并不是真正的bundle(?),所以将它们作为bundle加载可能会在将来产生不可预见的后果
可能还有其他问题,上述问题的解决方案,或者上述问题可能根本不是问题,但我一直没能想到它们

这个问题可能更适合我,但我觉得它也适合这里。如果需要将其移动到那里,请随意操作或告诉我操作。

框架(从“Cocoa Touch框架”模板创建)具有捆绑标识, 它存储在生成的框架包的Info.plist中

捆绑包标识符在常规目标设置中配置。 默认情况下,它是

您可以使用此标识符定位框架,例如:

let frameworkBundle = NSBundle(identifier: "com.duffy.AuthenticationManager")
let storyboard = UIStoryboard(name: "Storyboard", bundle: frameworkBundle)
这里有一个更干净的解决方案(不涉及框架标识符):

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

Swift 3示例:

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

对于Swift 3/4,现在只需捆绑:

let bundle = Bundle(identifier: "com.myframework.id")
let storyboard = UIStoryboard(name: "FrameworkMain", bundle: bundle)

这是一种更好的方法,可以在Swift 3中加载捆绑包,而无需传递更可能失败的字符串

let myBundle = Bundle(for: MyViewController.self)
let myStoryboard = UIStoryboard(name: "StoryboardName", bundle: myBundle) 

而不是让storyboardBundle=NSBundle(forClass:self),现在它应该是让storyboardBundle=NSBundle(forClass:className.self)@azimov,这要看情况而定。如果它在静态方法中,
self
就足够了。我加了一个小便条,使事情更清楚。谢谢如果此代码是从框架本身中的类中执行的,那么它只是一个更干净的解决方案。如果框架的“消费者”想要访问(并且对各个类的访问控制设置为public),那么接受的答案仍然是可行的。@wuf810您仍然可以在其
YourClass.self中使用框架中的类,不是吗?有没有办法从框架内访问应用程序包。使用标识符可能不是可行的方法,因为框架可能不知道应用程序包标识符。@niks:
bundle.main
是主要的应用程序包。您好,我知道这个主题已经有4年了。。我想做几乎相同的事情,但我没有找到任何教程或好的例子,所以我可以从中学习。你(或其他人)能帮我吗?只要给我一个提示或一些链接。。非常感谢你,如果你有像R.Swift这样的东西,你可以使用生成的故事板名称来保证编译时的安全
let myBundle = Bundle(for: MyViewController.self)
let myStoryboard = UIStoryboard(name: "StoryboardName", bundle: myBundle)