¿Qué método delegado debería utilizar para responder a los clics en un NSTextField?
-
22-08-2019 - |
Pregunta
Estoy tratando de responder a una click
dentro de un textfield
. Cuando se produce el clic, voy a abrir un panel
. Mi idea inicial era utilizar un método delegate
a responder al evento click
- pero encontró que:
Este método no funciona:
(void)textDidBeginEditing:(NSNotification *)aNotification
Este método hace de trabajo, pero sólo cuando realmente editar el texto dentro del campo de texto, no la primera vez que haga clic en él. Y - si puedo editar el texto por segunda vez, este método deja de funcionar:
(void)controlTextDidBeginEditing:(NSNotification *)aNotification
Podría usar tantos detalles como sea posible - o un ejemplo de código, a ser posible. Yo sé que un nstextfield
hereda de NSControl
, que tiene un evento mouseDown
. ¿Hay una manera similar a responder al evento con un textfield
, también?
Solución
Desde NSTextField
hereda de la clase NSControl
, también hereda el método -(void)mouseDown:(NSEvent*) theEvent
.
Otros consejos
necesitaba tener un NSTextField
llamar a una función delegada al hacer clic en él hoy, y pensé que este código básico podría ser útil. Tenga en cuenta que NSTextField
ya cuenta con un delegado y que en SDK v10.6, el delegado ya cuenta con un protocolo asociado a él. Tenga en cuenta que si no se preocupan por los protocolos, las advertencias del compilador, etc., no es necesario las declaraciones de protocolo y de los bienes o el get y set.
MouseDownTextField.h:
#import <Appkit/Appkit.h>
@class MouseDownTextField;
@protocol MouseDownTextFieldDelegate <NSTextFieldDelegate>
-(void) mouseDownTextFieldClicked:(MouseDownTextField *)textField;
@end
@interface MouseDownTextField: NSTextField {
}
@property(assign) id<MouseDownTextFieldDelegate> delegate;
@end
MouseDownTextField.m:
#import "MouseDownTextField.h"
@implementation MouseDownTextField
-(void)mouseDown:(NSEvent *)event {
[self.delegate mouseDownTextFieldClicked:self];
}
-(void)setDelegate:(id<MouseDownTextFieldDelegate>)delegate {
[super setDelegate:delegate];
}
-(id)delegate {
return [super delegate];
}
AppDelegate.h:
@interface AppDelegate <MouseDownTextFieldDelegate>
...
@property IBOutlet MouseDownTextField *textField;
...
AppDelegate.m:
...
self.textField.delegate = self;
...
-(void)mouseDownTextFieldClicked:(MouseDownTextField *)textField {
NSLog(@"Clicked");
...
}
...
Si usted está construyendo con 10,5 SDK, no tienen la hereda protocolo de NSTextFieldDelegate
.