Swift:如何在 NSMenuItem 处于活动状态(可见)时更新它?
Swift: How can I update NSMenuItem while it is active (visible)?
我创建了一个简单的计时器,用于更新 NSMenuItem 中的计数器。
func timerUpdate(){
dispatch_async(dispatch_get_main_queue()){
// calculating time
let timeLeft = self.lxTimeLeft() // returns a double of remaining seconds
let hoursLeft = Int(timeLeft/3600)
let minLeft = Int(timeLeft/60) - (hoursLeft*60)
let secLeft = Int(timeLeft) - (hoursLeft*3600) - (minLeft*60)
let hoursLeftStr = String(format:"%02d", hoursLeft)
let minLeftStr = String(format:"%02d", minLeft)
let secLeftStr = String(format:"%02d", secLeft)
println("timeLeft \(hoursLeftStr):\(minLeftStr):\(secLeftStr)")
self.menuActiveFor.title = "\(self.activatedFor) \(hoursLeftStr):\(minLeftStr):\(secLeftStr)h"
self.statusMenu.update() // not working
}
}
基本上它可以工作,但是当我打开 NSMenu 时它不会刷新 NSMenuItem (UI)。我找到了 Objective-C (How to update NSMenu while it's open?) 的解决方案,但遗憾的是,我无法使用 Swift.
进行调整
您需要阅读有关 NSRunLoop
的文档,当您的菜单显示时 none 您的线程将获得控制权。你需要告诉 OS 你想参加。
我创建了一个简单的计时器,用于更新 NSMenuItem 中的计数器。
func timerUpdate(){
dispatch_async(dispatch_get_main_queue()){
// calculating time
let timeLeft = self.lxTimeLeft() // returns a double of remaining seconds
let hoursLeft = Int(timeLeft/3600)
let minLeft = Int(timeLeft/60) - (hoursLeft*60)
let secLeft = Int(timeLeft) - (hoursLeft*3600) - (minLeft*60)
let hoursLeftStr = String(format:"%02d", hoursLeft)
let minLeftStr = String(format:"%02d", minLeft)
let secLeftStr = String(format:"%02d", secLeft)
println("timeLeft \(hoursLeftStr):\(minLeftStr):\(secLeftStr)")
self.menuActiveFor.title = "\(self.activatedFor) \(hoursLeftStr):\(minLeftStr):\(secLeftStr)h"
self.statusMenu.update() // not working
}
}
基本上它可以工作,但是当我打开 NSMenu 时它不会刷新 NSMenuItem (UI)。我找到了 Objective-C (How to update NSMenu while it's open?) 的解决方案,但遗憾的是,我无法使用 Swift.
进行调整您需要阅读有关 NSRunLoop
的文档,当您的菜单显示时 none 您的线程将获得控制权。你需要告诉 OS 你想参加。