Mit NSProgressIndicator innerhalb eines NSMenuItem
-
10-10-2019 - |
Frage
Ich versuche, eine NSProgressIndicator (unbestimmt) innerhalb eines statusbar-Menüs. Ich bin mit einem NSView-Objekt als Ansicht für das menuitem, und dann Subviews die Statusanzeige, um es anzuzeigen. Aber immer, wenn ich versuche, die startAnimation zu nennen: für den Fortschritt, passiert nichts. Wenn ich versuche, die gleiche Sache auf einem normalen tun NSWindow es perfekt funktioniert, nur nicht, wenn in einem menuitem.
Ich bin neu sowohl auf Kakao und Objective-C, damit ich etwas „offensichtlich“ übersehen habe könnte, aber ich habe ziemlich viel für eine Abhilfe gesucht, aber ohne Erfolg. Ich fand etwas über menuitems kann nicht aktualisiert werden, während gezeigt und dass Sie benötigen ein bordeless Fenster stattdessen zu verwenden. Aber ich habe nicht in der Lage gewesen, dies in keiner Dokumentation zu bestätigen.
Edit:
Ok, funktioniert jetzt fast. Bei Verwendung des setUsesThreadedAnimation: und von A MenuDelegate des menuWillOpen und einen neuen Faden zu schaffen. Dieser Thread läuft eine lokale Methode:
-(void) doWork(NSProgressIndicator*) p{
[p startAnimation:self];
}
Dies wird die Progress an einer zufälligen (?) Basis starten, wenn Sie das Menü öffnen. Wenn es startAnimation:
direkt ohne Umweg über doWork:
gehen (noch einen neuen Thread mit) nennen, es funktioniert nie. Nicht setUsesThreadedAnimation:
machen die Fortschrittsbalken schaffen es eigenen Thread für die Animation ist?
Lösung
Gelöst es durch die Verwendung:
[progressIndicator performSelector:@selector(startAnimation:)
withObject:self
afterDelay:0.0
inModes:[NSArray
arrayWithObject:NSEventTrackingRunLoopMode]];
Im Innern der menuWillOpen :, das Problem scheint startAnimation zu haben angerufen. Vor dem progressbar fertig war selbst zeichnen
Andere Tipps
Wie verweisen Sie die NSProgressIndicator
die in der Ansicht (und die man in dem Fenster, was das betrifft)? Zum Beispiel haben Sie eine Controller-Klasse, die IBOutlet
die süchtig bis zu den Fortschrittsindikatoren hat? Wenn Sie eine IBOutlet
verwenden, werden Sie sicher, es ist richtig in der Nib-Datei angeschlossen?
Auch wo und wann rufen Sie startAnimation:
? (Wir brauchen einen Code zu sehen).
Eine Sache, die manchmal passieren kann, ist, dass Sie vergessen, ein IBOutlet
in der Spitze zu anschließen. Dann, wenn Sie versuchen, das Objekt zu sagen, etwas in Code zur Laufzeit zu tun, ist die IBOutlet
nil
, und so etwas denken Sie, ist eine Nachricht an Ihre Aufgabe ist es in der Tat gesendet wird, eine Nachricht an nil
gesendet werden. Mit anderen Worten, es ist nur ignoriert, und sieht effektiv wie es nicht funktioniert.
Vorausgesetzt, Sie tun müssen, einen (potentiell) gültig Bezug auf das UI-Objekt, das andere verbreitete Problem, Sie sehen, ist, wenn ein Entwickler versucht, auf „zu früh“ von einer Zeit, eine Nachricht an das Objekt zu senden. Im Allgemeinen sind init
Methoden zu früh in der Lebensdauer des Controller-Objekt, um Nachrichten an Benutzerschnittstelle senden Objekte-diejenigen IBOutlet
die sind noch nil
. Durch die Zeit -awakeFromNib
genannt wird, IBOutlet
ist gültig sein sollte (sofern man sie in IB angeschlossen) und Sie können dann die Nachricht an das UI-Objekt senden.
Haben Sie es gesagt Gewinde Animation über -setUsesThreadedAnimation zu verwenden:?