我一直在寻找一个简单的示例,演示如何在文本字段中按下回车键时触发操作(或按钮)。
我需要继承文本字段吗?我需要设置委托来调用所需的操作吗?有没有办法在我的主窗口控制器类中捕获事件?
如果您能指导我方向,那就太好了。谢谢。
我一直在寻找一个简单的示例,演示如何在文本字段中按下回车键时触发操作(或按钮)。
我需要继承文本字段吗?我需要设置委托来调用所需的操作吗?有没有办法在我的主窗口控制器类中捕获事件?
如果您能指导我方向,那就太好了。谢谢。
参考答案评论中提到的网站现在被主机商“暂停”,而 Google 缓存中也没有包含关键步骤的截图。
以下是我发现的另一种解决方案:
对于某些按键(如 Enter、Delete、Backspace 等),苹果公司不会调用常规的 controlTextDidEndEditing: 等方法。相反,苹果公司为每个幻数键提供单独的选择器 - 但有一个方法可以拦截它。
苹果公司的官方文档在此处:
...但如果该文档消失/移动了,请将此方法添加到您的代理中:
- (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语句来针对它做出反应。
当你按下回车后,可以在窗口控制器中编写一个IBAction并将其连接到文本字段以获取操作。如果您希望更多功能,例如当您聚焦于文本字段并离开文本字段时应调用您的方法,则需要设置委托(请参考此处)。
只需将您的控制器类的IBAction与文本字段连接即可。当您按下Enter键或使用Tab或鼠标离开文本字段时,应调用该操作。
对于好奇的人,这里是如何实现-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
}
}
对我来说非常有效。
最好的做法是使用 control + drag
到你已经创建的操作,这样按下 return
也会触发该操作。
[[NSApp currentEvent].charactersIgnoringModifiers isEqualToString:@"\r"]
。 - lhunath