【问题标题】:How to correctly handle <Return> + modifier keys in a NSTextField?如何正确处理 NSTextField 中的 <Return> + 修饰键?
【发布时间】:2014-02-28 23:39:30
【问题描述】:

当用户编辑NSTextField 时,我希望能够处理三种不同的组合键:

  • ⌘↩
  • ⇧↩

每种组合都会有不同的反应。

理想情况下,我想仅通过 IB 来实现这一目标。但是,我的理解是 Cocoa 只允许每个控件发送一个操作。

我可以将此发送的操作绑定到 IBAction 并将 NSTextField 设置为仅在按下返回键时发送它,但我无法找到当前按住哪些修饰键的方法(如该操作仅接收(id)sender,而不是事件对象)。这可能吗?

或者,我想可以继承NSTextField,覆盖keyDown:,然后手动运行适当的操作。但是,我想不出如何在 IB 中正确连接它。 (我可以为目标使用IBOutlet,但我想不出一种连接特定方法的方法。)我也担心这种方法的效率。

NSTextField 上处理某些关键事件的正常方式是什么?


我目前倾向于的方法是编写自定义协议并在文本字段子类上放置一个出口:

@property (weak, nonatomic) IBOutlet id<TextFieldReturnHandler> target

然后可以从按键事件中调用。不过,这似乎真的很令人费解。

【问题讨论】:

    标签: objective-c cocoa nstextfield


    【解决方案1】:

    您可以将发送的操作连接到控制器上的方法:

    - (IBAction)cellDidEndEditing:(id)sender;
    

    如果您只想在按下返回键时调用此方法,而不是在用户点击离开时调用此方法,您可以将 IB 中 NSTextField 上的 Action 属性设置为“Send On Enter Only”,而不是'发送结束编辑'。

    在此方法中,您可以通过以下方式访问事件:

    NSEvent *evt = [NSApp currentEvent];
    

    在检查事件是否有效后,您可以获得必要的修饰符标志并对其进行操作:

    if (evt && evt.type == NSKeyDown) {
        evt.modifierFlags // NSShiftKeyMask, NSCommandKeyMas, NSAlternateKeyMask
    
        // Perform actions
    }
    

    【讨论】:

    • 使用修饰符标志进入时不会调用该操作。
    猜你喜欢
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 2021-01-17
    • 2013-02-02
    相关资源
    最近更新 更多