Neuzeichnen einer SFAuthorizationPluginView
-
21-12-2019 - |
Frage
Ich schreibe ein benutzerdefiniertes AuthenticationPlugin, das dynamische Inhalte enthält (derzeit in Form von Labels).Ich möchte die Beschriftungen als Reaktion auf Ereignisse aktualisieren können.
Gehen wir von folgenden Deklarationen aus:
parent = SFAuthorizationPluginView (subclass)
view = NSView (subclass)
NSTextField *label = ...
Ich bearbeite den Beschriftungstext wie folgt (Hinweis:Dies kann aus der Hintergrund-Versandwarteschlange ausgeführt werden):
[label setStringValue:@"new text"];
Ich versuche dann, ein Update zu erzwingen, indem ich Folgendes verwende:
[label setNeedsDisplay:YES];
dispatch_async(dispatch_get_main_queue(), ^{ [label setNeedsDisplay:YES]; });
[label display];
dispatch_async(dispatch_get_main_queue(), ^{ [label display]; });
[[label cell] update];
dispatch_async(dispatch_get_main_queue(), ^{ [[label cell] update]; });
[[label cell] needsDisplay];
dispatch_async(dispatch_get_main_queue(), ^{ [[label cell] needsDisplay]; });
[view setNeedsDisplay:YES];
dispatch_async(dispatch_get_main_queue(), ^{ [view setNeedsDisplay:YES]; });
[self updateView];
dispatch_async(dispatch_get_main_queue(), ^{ [self updateView]; });
[self displayView]
dispatch_async(dispatch_get_main_queue(), ^{ [self displayView]; });
Ich erhalte jedoch eine Mischung aus keiner Aktion und einem flackernden grauen Bildschirm (was darauf hindeutet, dass ich eine Ausnahme verursacht habe).
Irgendwelche Ideen?(Notiz:Ich werde diese Frage bearbeiten, während ich verschiedene Optionen ausprobiere.)
Lösung
Ich denke, alles, was Sie tun müssen, ist, die Aktualisierung des Etiketts wie folgt in den Hauptwarteschlangencode einzufügen:
dispatch_async(dispatch_get_main_queue(), ^{
label.text = "Hello World!";
});