如何从 OS X 上的框架实例化 NSViewController(即获取正确的包)
Posted
技术标签:
【中文标题】如何从 OS X 上的框架实例化 NSViewController(即获取正确的包)【英文标题】:How to instantiate NSViewController from a Framework on OS X (i.e. getting the correct bundle) 【发布时间】:2015-04-27 21:41:06 【问题描述】:如何从添加到我的 OS X 应用程序的框架中实例化视图控制器 (这实际上可能与 ios 相同,我不确定,上次我查看了 iOS 上不允许的框架,但这可能变了)?
设置如下:
私有框架MyFramework.framework
,
包含一个视图控制器CustomViewController
,
与XIB CustomViewController.xib
。
什么不起作用
CustomViewController(nibName: "CustomViewController", bundle:nil)
将不起作用,因为资源不在在应用程序的主包中(它们在框架中)。
有什么作用
要使用以下代码从我的应用程序的框架中实例化视图控制器(它有效!),该代码使用NSBundle.allFrameworks()
遍历所有加载的框架,并通过比较bundleIdentifier
来挑选我的框架,
func findMyFrameworkBundle() -> NSBundle?
if let frameworkBundles = NSBundle.allFrameworks() as? [NSBundle]
for bundle in frameworkBundles
if let identifier = bundle.bundleIdentifier
if identifier == "com.Me.MyFramework"
return bundle
return nil
let nibName = "CustomViewController"
let bundle = findMyFrameworkBundle()
let viewController = CustomViewController(nibName:nibName, bundle:bundle)
如何改进?
这似乎过于复杂,让我觉得我一定做错了什么。一些潜在的解决方案:
-
我能否更改我的框架并提供自定义初始化程序,该初始化程序始终使用正确的包实例化视图控制器?
例如,
class CustomViewController : NSViewController
init()
let bundle = // ... the correct bundle even when used as an embedded framework in an App
super.init(nibName: "CustomViewController", bundle: bundle)
// ... other code
-
有没有比搜索
NSBundle.allFrameworks()
更好的方法在我的应用程序中提供正确的捆绑包?
【问题讨论】:
【参考方案1】:我可能误解了您的问题,但我认为标准做法是使用将标识符作为唯一参数的NSBundle
构造函数。如:
let bundle = NSBundle(identifier: "com.Me.MyFramework")!
【讨论】:
我已经为框架中的所有视图控制器创建了新的初始化程序,并按照您的建议加载包。有用!这使得包加载对用户来说是透明的。谢谢。以上是关于如何从 OS X 上的框架实例化 NSViewController(即获取正确的包)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Unity 游戏引擎平台上的单元测试中实例化 MonoBehaviour 对象