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
    }
}
¿Fue útil?

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
    }
}

http://developer.apple.com/library/mac/#documentation/cocoa/reference/applicationkit/classes/nscontrol_class/reference/reference.html#//apple_ref/occ/nscontrol

No hay forma de obtener el NSEvents 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".

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