NSTextField进入触发操作

时间:2010-04-14 05:44:57

标签: objective-c cocoa nstextfield

我一直在寻找一个简单的例子,说明当在文本字段中点击回车键时如何触发操作(或按钮)。

我应该对文本字段进行子类化吗?我是否需要设置代理来调用我需要的操作?有没有办法在我的主窗口控制器类中捕获事件?

如果你能指出正确的方向,那就太好了。感谢。

5 个答案:

答案 0 :(得分:22)

在接受回答的评论中引用的网站...现在由网站主机“暂停”,而Google缓存没有包含关键步骤的屏幕截图。

所以,这是我发现的另一种解决方案:

  1. 完美运作
  2. 不需要子类化
  3. 对于某些键(Enter,Delete,Backspace等),Apple不会调用正常的controlTextDidEndEditing:etc方法。相反,Apple会为每个魔术键执行单独的选择器 - 但是有一种方法可以用来拦截它。

    Apple的官方文档:

    https://developer.apple.com/library/mac/documentation/TextFonts/Conceptual/CocoaTextArchitecture/TextEditing/TextEditing.html#//apple_ref/doc/uid/TP40009459-CH3-SW31

    ...但是如果消失/被移动,请将此方法添加到您的委托中:

    - (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也会触发操作。