Pregunta

Poco a poco estoy aprendiendo Objective-C y Cocoa, y la única forma que veo hasta ahora de capturar eventos clave en Vistas de texto es usar la delegación, pero tengo problemas para encontrar documentación y ejemplos útiles sobre cómo implementar dicha solución.¿Alguien puede indicarme la dirección correcta o brindarme ayuda de primera mano?

¿Fue útil?

Solución

Generalmente, la forma de implementarlo es simplemente agregar la función requerida al controlador de su vista y configurar su delegado.Por ejemplo, si desea que el código se ejecute cuando se carga la vista, simplemente delega su vista al controlador e implementa la función awakeFromNib.

Entonces, para detectar una pulsación de tecla en una vista de texto, asegúrese de que su controlador sea el delegado de la vista de texto y luego implemente esto:

- (void)keyUp:(NSEvent *)theEvent

Tenga en cuenta que este es un método NSResponder heredado, no un método NSTextView.

Otros consejos

Sólo un consejo para resaltar la sintaxis:

No resalte toda la vista de texto a la vez: es muy lento.Tampoco resalte el último texto editado usando -editedRange; también es muy lento si el usuario pega un cuerpo grande de texto en la vista de texto.

En su lugar, debe resaltar el texto visible, que se hace así:

NSRect visibleRect = [[[textView enclosingScrollView] contentView] documentVisibleRect];
NSRange visibleRange = [[textView layoutManager] glyphRangeForBoundingRect:visibleRect inTextContainer:[textView textContainer]];

Luego alimenta visibleRange a su código de resaltado.

Es importante decirnos qué es lo que realmente está tratando de lograr: el objetivo de nivel superior que cree que abordará la captura de eventos clave en un NSTextView.

Por ejemplo, cuando alguien me pregunta cómo capturar eventos clave en un NSTextCampo lo que realmente quieren saber es cómo validar los datos aportados en el campo.Esto se hace estableciendo el formateador del campo en una instancia de NSFormatter (ya sea uno de los formateadores incluidos en Cocoa o uno personalizado), no procesando las pulsaciones de teclas directamente.

Entonces, dado ese ejemplo, ¿qué estás tratando de lograr realmente?

Investigué un poco y encontré una respuesta a mi propia pregunta.Lo abordaré a continuación, pero gracias a los dos muchachos que respondieron.Creo que Stack Overflow ya es un sitio fantástico. Espero que más desarrolladores de Mac encuentren su camino una vez finalizada la versión beta. Este podría ser un gran recurso para otros desarrolladores que buscan hacer la transición a la plataforma.

Entonces, como sugirió Danny, encontré mi respuesta en la delegación.Lo que no entendí de la publicación de Danny fue que hay un conjunto de métodos habilitados para delegados en el objeto de delegación y que el delegado debe implementar dichos eventos.Y así, para TextView, pude encontrar el método textDidChange, que logró lo que quería de una manera incluso mejor que la simple captura de pulsaciones de teclas.Entonces, si implemento esto en mi controlador:

- (void)textDidChange:(NSNotification *)aNotification;

Puedo responder al texto que se está editando.Por supuesto, hay otros métodos disponibles y estoy emocionado de jugar con ellos, porque sé que aprenderé mucho mientras lo hago.Gracias de nuevo, chicos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top