Obtención de la tecla de función Presione en NSSearchfield sin subclasificar
-
27-10-2019 - |
Pregunta
Tengo una aplicación simple que tiene un NSSearchField
Y quiero saber si el usuario presiona, por ejemplo, una tecla de flecha. No quiero subclase, porque quiero modificar los valores de los iBoutlets en mi aplicación, y no puedo hacerlo en una subclase.
EDITAR
los keyUp:
método que anulé en mi NSSearchField
La subclase es:
-(void)keyUp:(NSEvent*)event
{
if ([event keyCode]==36){
customers* c= [[customers alloc] init];//customers is the class where i have my IBOulets and my methods
[[self window] selectKeyViewFollowingView:self];// change the first responder
[c searcht:[self stringValue]];//here i want to call a method to make a query and change the stringValues of some IBOulets
}
}
Solución
Asigne su controlador como delegado de su campo de búsqueda e implementa el método:
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)command
Luego debería poder recibir selectores simples de NSPONDER como MOVEDOWN:, MoveUp:, Moveleft:, Moveright: que corresponde a las teclas de flecha.
Otros consejos
NSSearchfield hereda de NSControl que tiene el método delegado que está buscando.
- (void)controlTextDidChange:(NSNotification *)aNotification
Establezca el NSSearchfield como su delegado e implementa este método. Es posible que desee ejecutar un cheque para asegurarse de que sea su NSSearchfield lo que comenzó a editar. Tal vez podrías usar FirStrponder. Algo como:
- (void)controlTextDidChange:(NSNotification *)aNotification {
If (mySearchField.isFirstResponder) {
//throwdown
}
}
No hay forma de obtener el NSEvent
s que ya se han entregado a una vista cuyo código no tiene. Si desea cambiar el comportamiento de manejo clave de una vista o control, debe subclase. Es posible que pueda insertar otro objeto antes de El campo de búsqueda en la cadena de respondedores, obtiene el evento, haz lo que quieras y luego actúa como si no lo manejara y lo pase al campo ... solo un pensamiento salvaje desde la parte superior de mi cabeza.
ACTUALIZAR en respuesta a tu keyUp:
código:
De acuerdo, el problema se está aclarando. Cuando creas ese nuevo customer
* Objeto en código, también debe conectar sus conexiones en el código. No están conectados para ti. En realidad no usas IBOutlets
Para esto, solo viejos Ivars regulares. IBOutlets
están solo allí para que pueda conectar objetos en la interfaz gráfica de Interface Builder. No sé exactamente lo que estás tratando de hacer en searcht:
, pero solo como ejemplo, si desea cambiar el contenido de un campo de texto:
- (void)searcht:(NSString *)theString {
// Do some stuff with the string
[myTextField setStringValue:someResultString];
}
Donde el cliente.H se ve como:
@interface customer : NSObject {
IBOutlet NSTextField * myTextField;
}
Esto no hará nada, incluyendo no dar advertencia, porque myTextField
es nil
. Puedes llamar a los métodos en nil
todo el día y no pasará nada. Lo que necesitas hacer es dar el customer
Objetar un puntero al campo de texto; Esto no debería ser un IBOutlet
. Podrías hacer esto en un init...
método, o simplemente configurándolo directamente (tenga en cuenta que esto significa que el campo de búsqueda tendrá que tener una conexión al campo de texto para pasarlo al Customer
, que puede o no ser deseable):
@interface Customer : NSObject {
NSTextField * myTextField;
}
@property NSTextField * myTextField; // Note: does not need to be retained.
@end
#import "Customer.h"
@implementation Customer
@synthesize myTextField;
- (id)initUsingTextField:(NSTextField *)tf {
if( !(self = [super init]) ) {
return nil;
}
myTextField = tf;
return self;
}
@end
*Como aparte, los nombres de clase convencionalmente en OBJ-C comienzan con letras mayúsculas: "Cliente", no "Cliente".