目标C语言 在没有子类化的情况下获得NSSearchField的功能按键



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

编辑

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

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

指定你的控制器作为你的搜索域的委托,并实现方法:

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

你应该能够接收简单的NSResponder选择器,如moveDown:, moveUp:, moveLeft:, moveRight:,它们对应于箭头键。

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

- (void)controlTextDidChange:(NSNotification *)aNotification

设置NSSearchField作为你的委托并实现这个方法。可能需要运行一个检查来确保是你的NSSearchField开始编辑。也许你可以使用FirstResponder。比如:

- (void)controlTextDidChange:(NSNotification *)aNotification {
    If (mySearchField.isFirstResponder) {
        //throwdown
    }
}

http://developer.apple.com/library/mac/文档/可可/引用/ApplicationKit/类/NSControl_Class/引用/Reference.html #//apple_ref/occ/cl/NSControl

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

更新回复你的keyUp:代码:

好了,问题越来越清楚了。当您在代码中创建新的customer *对象时,还必须在代码中连接它的连接。它们不是为你连接的。实际上你不用IBOutlets来做这个,只用常规的旧变量。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;
}

这将不做任何事情,包括不给出警告,因为myTextFieldnil。你可以一整天都在nil上调用方法,什么也不会发生。你需要做的是给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"。

相关内容

  • 没有找到相关文章

最新更新