3

我有一个简单的应用程序,它有一个NSSearchField,我想知道用户是否按下,例如,箭头键。我不想子类化,因为我想在我的应用程序中修改 IBOutlets 的值,而我不能在子类中这样做。

编辑

keyUp:我在子类中覆盖的方法NSSearchField是:

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

3 回答 3

11

将您的控制器分配为您的搜索字段的代表并实现该方法:

- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)command

然后,您应该能够接收到与箭头键相对应的简单 NSResponder 选择器,例如 moveDown:、moveUp:、moveLeft:、moveRight:。

于 2011-04-30T09:35:57.327 回答
2

NSSearchField 继承自 NSControl ,它具有您正在寻找的委托方法。

- (void)controlTextDidChange:(NSNotification *)aNotification

将 NSSearchField 设置为您的委托并实现此方法。可能需要进行检查以确保开始编辑的是您的 NSSearchField。也许你可以使用 FirstResponder。就像是:

- (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/cl/NSControl

于 2011-04-29T15:10:48.557 回答
1

没有办法获得NSEvent已经交给视图的 s ,而视图的代码你没有。如果要更改视图或控件的键处理行为,则必须进行子类化。您可能能够在响应者链中的搜索字段之前插入另一个对象,获取事件,做任何您想做的事情,然后表现得像您没有处理它并将其传递给该字段......只是一个疯狂的想法从我的头顶。

更新回复您的keyUp:代码:

好的,问题越来越清楚了。当您在代码中创建新的customer* 对象时,您还必须在代码中连接它的连接。他们没有为你连接。您实际上并没有IBOutlets为此使用,只是普通的旧 ivars。IBOutlets只是为了让您可以在 Interface Builder 的图形界面中连接对象。我不确切知道您要在 中做什么searcht:,但举个例子,如果您想更改文本字段的内容:

- (void)searcht:(NSString *)theString {

    // Do some stuff with the string

    [myTextField setStringValue:someResultString];

}

customer.h 看起来像这样:

@interface customer : NSObject {
    IBOutlet NSTextField * myTextField;
}

这不会做任何事情,包括不发出警告,因为myTextFieldis nilnil你可以整天调用方法,什么都不会发生。您需要做的是给customer对象一个指向文本字段的指针;这不应该是一个IBOutlet. 您可以在init...方法中执行此操作,或者直接设置它(请注意,这意味着搜索字段必须与文本字段建立连接才能将其传递给Customer,这可能是可取的,也可能不是可取的) :

@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

*顺便说一句,Obj-C 中的类名通常以大写字母开头:“Customer”,而不是“customer”。

于 2011-04-29T19:54:26.190 回答