Melhor maneira de capturar eventos importantes no NSTextView?
-
08-06-2019 - |
Pergunta
Estou aprendendo lentamente Objective-C e Cocoa, e a única maneira que vejo até agora de capturar eventos importantes em Text Views é usar delegação, mas estou tendo problemas para encontrar documentação útil e exemplos sobre como implementar tal solução.Alguém pode me indicar a direção certa ou fornecer ajuda em primeira mão?
Solução
Geralmente, a maneira como você implementa isso é simplesmente adicionar a função necessária ao controlador da sua visualização e definir seu delegado.Por exemplo, se você deseja que o código seja executado quando a visualização for carregada, basta delegar sua visualização ao controlador e implementar a função wakeFromNib.
Portanto, para detectar o pressionamento de uma tecla em uma visualização de texto, certifique-se de que seu controlador seja o delegado da visualização de texto e implemente isto:
- (void)keyUp:(NSEvent *)theEvent
Observe que este é um método NSResponder herdado, não um método NSTextView.
Outras dicas
Apenas uma dica para realce de sintaxe:
Não destaque toda a visualização do texto de uma só vez - é muito lento.Além disso, não destaque o último texto editado usando -editedRange - também será muito lento se o usuário colar um grande corpo de texto na visualização de texto.
Em vez disso, você precisa destacar o texto visível, feito assim:
NSRect visibleRect = [[[textView enclosingScrollView] contentView] documentVisibleRect];
NSRange visibleRange = [[textView layoutManager] glyphRangeForBoundingRect:visibleRect inTextContainer:[textView textContainer]];
Em seguida, você alimenta visívelRange em seu código de destaque.
É importante nos dizer o que você realmente está tentando realizar - o objetivo de nível superior que você acha que a captura de eventos importantes em um NSTextView irá abordar.
Por exemplo, quando alguém me pergunta como capturar eventos importantes em um NSTextCampo o que eles realmente querem saber é como validar as informações em campo.Isso é feito definindo o formatador do campo para uma instância do NSFormatter (seja um dos formatadores incluídos no Cocoa ou um customizado), e não processando as teclas digitadas diretamente.
Então, dado esse exemplo, o que você realmente está tentando realizar?
Pesquisei bastante e encontrei uma resposta para minha própria pergunta.Falarei disso abaixo, mas obrigado aos dois caras que responderam.Acho que Stack Overflow já é um site fantástico - espero que mais desenvolvedores de Mac encontrem seu caminho assim que a versão beta terminar - este pode ser um ótimo recurso para outros desenvolvedores que desejam fazer a transição para a plataforma.
Então, conforme sugerido por Danny, encontrei minha resposta na delegação.O que não entendi na postagem de Danny foi que há um conjunto de métodos habilitados para delegado no objeto de delegação e que o delegado deve implementar esses eventos.E assim, para um TextView, consegui encontrar o método textDidChange, que realizou o que eu queria de uma maneira ainda melhor do que simplesmente capturar teclas pressionadas.Então, se eu implementar isso no meu controlador:
- (void)textDidChange:(NSNotification *)aNotification;
Posso responder ao texto que está sendo editado.É claro que existem outros métodos disponíveis, e estou animado para brincar com eles, porque sei que aprenderei muito com isso.Obrigado novamente, pessoal.