我有一个简单的应用程序,它有一个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;
}
这将不做任何事情,包括不给出警告,因为myTextField
是nil
。你可以一整天都在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"。