背景
我正在将 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
协议采用者。