我一直在寻找一个简单的例子,说明当在文本字段中点击回车键时如何触发操作(或按钮)。
我应该对文本字段进行子类化吗?我是否需要设置代理来调用我需要的操作?有没有办法在我的主窗口控制器类中捕获事件?
如果你能指出正确的方向,那就太好了。感谢。
答案 0 :(得分:22)
在接受回答的评论中引用的网站...现在由网站主机“暂停”,而Google缓存没有包含关键步骤的屏幕截图。
所以,这是我发现的另一种解决方案:
对于某些键(Enter,Delete,Backspace等),Apple不会调用正常的controlTextDidEndEditing:etc方法。相反,Apple会为每个魔术键执行单独的选择器 - 但是有一种方法可以用来拦截它。
Apple的官方文档:
...但是如果消失/被移动,请将此方法添加到您的委托中:
- (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor doCommandBySelector:(SEL)commandSelector
{
BOOL retval = NO;
if (commandSelector == @selector(insertNewline:)) {
retval = YES; // causes Apple to NOT fire the default enter action
// Do your special handling of the "enter" key here
}
NSLog(@"Selector = %@", NSStringFromSelector( commandSelector ) );
return retval;
}
在我的情况下,我也想覆盖退格键 - 使用此方法运行应用程序,我得到输出说选择器是“deleteBackward:”,所以我在那里添加了另一个if语句来对此作出反应。
答案 1 :(得分:9)
要在输入后执行操作,只需在窗口控制器中编写IBAction并连接到文本字段。如果你想要更多的方法,那么当你专注于文本字段并且保留文本字段时应该调用你的方法,你需要设置委托(See here)。
答案 2 :(得分:2)
只需将控制器类的IBAction与文本字段连接即可。应该使用Tab键或鼠标按Enter键或保留文本字段来调用该操作。
答案 3 :(得分:1)
对于好奇,这里是如何实现-controlTextDidEndEditing:(NSNotification)obj
(如果你不关心只回答输入键)
AppDelegate.h:
// Conform to the protocol to avoid compiler warnings
@interface myClass : NSObject <NSTextFieldDelegate>
// Link up to the interface elements you want to trigger
@property (weak) IBOutlet NSTextField *myTextField;
@property (weak) IBOutlet NSButton *myButton;
// Create an action linked to myButton
- (IBAction)myButtonPressed:(id)sender;
// Advertise that you implement the method
- (void)controlTextDidEndEditing:(NSNotification *)obj;
AppDelegate.m:
@synthesize myTextField = _myTextField;
@synthesize myButton = _myButton;
// Make yourself the delegate
- (void)applicationDidFinishLoading:(NSNotification *)aMessage {
_myTextField.delegate = self;
}
// NSTextField objects send an NSNotification to a delegate if
// it implements this method:
- (void)controlTextDidEndEditing:(NSNotification *)obj {
if ([[obj object] isEqual:_textField]) {
[self myButtonPressed:nil]; // nil = sender
}
}
对我来说就像一个魅力。
答案 4 :(得分:1)
最好的办法是将control + drag
用于您已创建的操作,因此按return
也会触发操作。