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?

War es hilfreich?

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:?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top