2010-02-13 12 views
7

Pracuję nad prostą aplikacją czasową i utworzyłem NSStatusItem z menu i mam pewne etykiety NSTextField, które aktualizują etykiety timerów(), ale kiedy klikam na stan element NSTimer zatrzymuje się (i zatrzymuje aktualizowanie etykiet) ..... jak mogę obejść ten problem?NSTimer z aplikacją paska menu

EDIT: oto kod, który uruchamia zegar:

timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerDidUpdate:) userInfo:nil repeats:YES];

+0

będzie trzeba zobaczyć kod, gdzie start i stop stopera. Czy masz na myśli to, że timer aktualizuje etykiety? – TechZen

+0

Tak ............ – nanochrome

+0

i przestaje się aktualizować po kliknięciu elementu statusu, nie wiem, co jest nie tak. – nanochrome

Odpowiedz

4

Zgaduję timer wznawia jak najszybciej zatrzymać interakcji z NSStatusItem? (Po zwolnieniu przycisku menu & menu).

Interakcja użytkownika powoduje, że pętla główna działa w trybie, w którym nie aktualizuje liczników, więc jeśli etykieta musi być stale aktualizowana, prawdopodobnie będziesz musiał przenieść NSTimer i rysunek etykiety do osobnego procesu lub kolejny wątek.

+0

Przepraszam, jestem całkiem nowy dla obj-c/kakao, jak przejść do innego wątku itp. – nanochrome

+0

Jeśli jeszcze nie robiłeś gwintowania, zajmie to trochę czytania: Przewodnik po programowaniu wątków: http://tinyurl.com/yjnlegr Konteksty wątkowania i grafiki: http://tinyurl.com/yflqjjk Prostszym rozwiązaniem może być skonfigurowanie delegata dla menu, a następnie zaimplementowanie menuWillOpen: & menuDidClose: delegowanie metod czyszczenia etykieta/widok, gdy menu jest otwarte (więc przynajmniej użytkownik nie widzi etykiety nieaktualnej). –

11

Należy dodać licznik do MainRunLoop jak podano poniżej:

NSRunLoop * rl = [NSRunLoop mainRunLoop]; 
[rl addTimer:timer forMode:NSRunLoopCommonModes]; 
+0

To naprawdę wydaje się preferowaną odpowiedzią. –

+0

Wydaje się, że jest to zdecydowanie najłatwiejszy sposób na zrobienie tego. Możesz także zrobić to w jednym wierszu za pomocą '[[NSRunLoop currentRunLoop] addTimer: timer forMode: NSRunLoopCommonModes];' – seaturtle