【发布时间】:2021-11-04 03:24:21
【问题描述】:
我正在尝试使用键值观察来确定NSStatusItem 何时被用户以removalAllowed 行为拖出菜单栏。这是根据文档支持的:
具有此行为的状态项允许从菜单栏中交互式删除。移除后,该项目的 isVisible 属性更改为 false。 使用键值观察可以观察到这种变化。
但是,每当isVisible 属性更改时,回调函数似乎会触发两次。这是一个最小的示例(假设 statusItem 和 observer 是在应用程序的生命周期内保留的变量,例如在 AppDelegate 上)。
statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength)
statusItem.button!.image = NSImage(named: NSImage.addTemplateName)
statusItem.behavior = .removalAllowed
observer = statusItem.observe(\.isVisible, options: [.old, .new]) { object, change in
print("oldValue: \(change.oldValue!) newValue: \(change.newValue!)")
}
如果你将图标拖出菜单栏,它会打印以下内容:
oldValue: false newValue: true
oldValue: false newValue: true
我查看了change 对象上的每个属性,据我所知,它们都是相同的,因此没有简单的方法可以丢弃重复事件。我也弄乱了prior 选项,这似乎也没有帮助。
【问题讨论】:
标签: swift appkit key-value-observing nsstatusitem