如何从 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(即获取正确的包)的主要内容,如果未能解决你的问题,请参考以下文章

64 位系统上的 OS X Carbon 框架

如何在 OS X 目标中创建 CFDictionary?

如何在 Unity 游戏引擎平台上的单元测试中实例化 MonoBehaviour 对象

如何从 Mac OS X 10.7.3 卸载 Phonegap?

详解OS X和iOS图像处理框架Core Image

Vue2.x源码学习笔记-从一个小例子查看vm实例生命周期