我正在嘗試使用鍵值觀察來確定用戶何時將NSStatusItem具有removalAllowed行為的用戶拖出選單欄。這是根據檔案支持的:
具有此行為的狀態項允許從選單欄中互動式洗掉。移除后,專案的 isVisible 屬性更改為 false。使用鍵值觀察可以觀察到這種變化。
但是,每當isVisible更改屬性時,回呼函式似乎都會觸發兩次。這是一個最小的示例(假設statusItem和observer是在應用程式的生命周期內保留的變數,例如 on 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選項,這似乎也沒有幫助。
uj5u.com熱心網友回復:
擺脫重復的一個聰明的方法是用一個聯合發布者替換 KVO 觀察者。
import Combine
var cancellable : AnyCancellable?
cancellable = statusItem.publisher(for: \.isVisible)
.removeDuplicates()
.sink { value in
print(value)
}
如果您對舊值感興趣,可以添加Scan運算子
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/348892.html
標籤:迅速 应用套件 键值观察 nsstatusitem
