2011-03-05 10 views
14

Soy bastante nuevo en el desarrollo de mac (proveniente de un fondo web y de iOS) y no sé cómo puedo recibir una notificación cada vez que cambia el valor de un NSTextView. ¿Algunas ideas?Valor de NSTextView cambiado

Respuesta

35

Ups Acabo de ver que desea una devolución de llamada desde NSTextView y no NSTextField

Simplemente agregue en el encabezado del objeto que debe ser el delegado el protocolo

@interface delegateAppDelegate : NSObject <NSApplicationDelegate, NSTextViewDelegate> { 
    NSWindow *window; 
} 

Después de que agregue un método como

-(void)textDidChange:(NSNotification *)notification { 
    NSLog(@"Ok"); 
} 

Asegúrese de que ha conectado la propiedad delegado del NSTextView (no NSScrollView) con el objeto que debe recibir el delegado

+0

¡Eso es todo! Estoy bastante seguro de que esta fue una de las cosas que intenté, pero obviamente no lo hice bien. Está funcionando ahora :-) ¡Gracias! – tarnfeld

+2

NSTextViewDelegate implementa NSTextDelegate eso es lo que funciona, pero también podría usar métodos específicos NSTextViewDelegate como - (BOOL) textView: (NSTextView *) aTextView shouldChangeTextInRange: (NSRange) affectedCharRange replacementString: (NSString *) replacementString – valexa

+5

Esto solo obtendrá cambios del usuario interactuando directamente con NSTextView (p. ej., el usuario escribe en la vista de texto o copia y pega en ella o corta de ella). No detectará cambios en textView si usted cambia programáticamente textView como en 'textView.string = @" Foo ";'. Para eso, necesitas ser el delegado de textStorage de textview, como en 'textView.textStorage.delegate = self;' e implementar '- (void) textStorageWillProcessEditing: (NSNotification *) aNotification' en la clase del objeto que es self. De esta forma obtendrá cambios dirigidos por el usuario y cambios directos en el establecimiento de la propiedad. – Joel

-1

establece el delegado de nstextfield. en el archivo .h del delegado de agregar el protocolo de delegado En el archivo .m se agrega un método como -(void)controlTextDidChange:(NSNotification *)obj { NSLog(@"ok"); }

Espero que ayude

+1

no esto es para NSTextField NSTextView – valexa

+0

NSTextView es una subclase de NSTextField y así son sus delegados – kezi

+3

Me temo que https://developer.apple.com/library/mac/documentation/cocoa/reference/applicationkit/classes/NSTextView_Class/Reference/Reference.html muestra claramente NSTextView hereda de NSText que hereda de NSView. NSTextField hereda de NSControl que también hereda de NSView. controlTextDidChange es un método delegado de NSControl que significa que NSTextField tiene acceso a controlTextDidChange, pero NSTextView no lo hace porque no hereda de NSControl o NSTextField. –

-2

Establecer el delegado y luego usar

- (void) controlTextDidChange: (NSNotification *) notification 
{ 
} 
+1

esto es para NSTextField no NSTextView – valexa

+0

NSTextView es una subclase de NSTextField y sus delegados también – kezi

+6

@kdogisthebest NSTextView NO es una subclase de NSTextField. –

2

Aquí está la solución:

NSTextView *textView = ...; 

@interface MyClass : NSObject<NSTextStorageDelegate> 
@property NSTextView *textView; 
@end 

MyClass *myClass = [[MyClass alloc] init]; 
myClass.textView = textView; 
textView.textStorage.delegate = myClass; 

@implementation MyClass 
- (void)textStorageDidProcessEditing:(NSNotification *)aNotification 
{ 
    // self.textView.string will be the current value of the NSTextView 
    // and this will get invoked whenever the textView's value changes, 
    // BOTH from user changes (like typing) or programmatic changes, 
    // like textView.string = @"Foo"; 
} 
@end 
Cuestiones relacionadas