3

背景

我正在将 TouchBar 添加到应用程序。我有几个窗口控制器应该使用相同的 TouchBar 设计,采用相同的协议(比如AddWindowCommon),并在它们自己的xib文件中设计。

xib我在一个单独的文件 ( AddWindowTouchBar)中设计了我的 TouchBar 。这样,我可以将文件设置为仅在 macOS 10.12.2+(支持 TouchBar 的版本)上编译,而项目的其余部分部署在 macOS 10.9+ 上。文件所有者采用该AddWindowCommon协议,并且触摸栏对其保持弱引用以正常运行。然后,要使用这个触摸栏,我会makeTouchBar这样覆盖:

@available(OSX 10.12.2, *)
open override func makeTouchBar() -> NSTouchBar? {
    return AddWindowTouchBar.instanceFromNib(withWindowController: self)
}

这调用了我的AddWindowTouchBar类的以下静态函数:

static func instanceFromNib(withWindowController windowController: AddWindowCommon) -> AddWindowTouchBar {
        var objects = NSArray()
        Bundle.main.loadNibNamed(xibName, owner: windowController, topLevelObjects: &objects)

        // ...
        // return the touchbar from `objects`
        // ...

}

问题

这里的问题是,采用该AddWindowCommon协议的类的awakeFromNib:方法被调用了两次:第一次是从它自己的 加载的xib,第二次AddWindowTouchBar是使用实例化loadNibNamed:owner:的,并且窗口控制器是所有者。

为了避免awakeFromNib:两次执行任务,我可以使用一个简单的布尔值来确保该类尚未从 nib 中唤醒,但我想知道是否有另一个更清洁的解决方案作用于协议采用者AddWindowTouchBar而不是AddWindowCommon协议采用者。

4

0 回答 0