Redesenhando um SFAuthorizationPluginView
-
21-12-2019 - |
Pergunta
Estou escrevendo um AuthenticationPlugin personalizado que possui algum conteúdo dinâmico (atualmente na forma de rótulos).Gostaria de poder atualizar os rótulos em resposta aos eventos.
Supondo as seguintes declarações:
parent = SFAuthorizationPluginView (subclass)
view = NSView (subclass)
NSTextField *label = ...
Eu edito o texto do rótulo da seguinte maneira (nota:isso pode ser executado a partir da fila de despacho em segundo plano):
[label setStringValue:@"new text"];
Em seguida, tento forçar uma atualização usando o seguinte:
[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]; });
No entanto, recebo uma mistura de nenhuma ação e tela cinza tremeluzente (indicando que causei uma exceção).
Alguma ideia?(Observação:Estarei editando esta pergunta enquanto tento várias opções)
Solução
Acho que tudo que você precisa fazer é colocar a atualização do rótulo no código da fila principal assim:
dispatch_async(dispatch_get_main_queue(), ^{
label.text = "Hello World!";
});