Swift: как я могу обновить NSMenuItem, пока он активен (виден)?

Я создал простой таймер, который обновляет счетчик в 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 (Как обновить NSMenu, пока оно открыто?), но, к сожалению, я не могу адаптировать это с помощью Swift.


person ixany    schedule 05.01.2015    source источник
comment
Используйте Runloop или Dispatch github.com/onmyway133/blog/issues/213   -  person onmyway133    schedule 23.04.2019


Ответы (1)


Вам нужно прочитать документ о NSRunLoop, когда отображается ваше меню, ни один из ваших потоков не получит управления. Вам нужно сообщить ОС, что вы хотите участвовать.

person qwerty_so    schedule 05.01.2015
comment
Спасибо! Добавление NSRunLoop.currentRunLoop().addTimer(yourTimer, forMode: NSRunLoopCommonModes) решило мою проблему. - person ixany; 12.01.2015