Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何正确处理<;回报>+;NSTextField中的修改器键?_Objective C_Cocoa_Nstextfield - Fatal编程技术网

Objective c 如何正确处理<;回报>+;NSTextField中的修改器键?

Objective c 如何正确处理<;回报>+;NSTextField中的修改器键?,objective-c,cocoa,nstextfield,Objective C,Cocoa,Nstextfield,当用户编辑NSTextField时,我希望能够处理三种不同的组合键: ↩ ⌘↩ ⇧↩ 这些组合中的每一个都将得到不同的响应 理想情况下,我希望通过IB来实现这一点。然而,我的理解是Cocoa只允许每个控件发送一个操作 我可以将此已发送的操作绑定到iAction,并将NSTextField设置为仅在按下返回键时发送,但我找不到方法获取当前按下的修改器键(因为该操作只接收(id)发送方,而不是事件对象)。可能吗 或者,我想可以将NSTextField子类化,覆盖keyDown:,并手动运行适当的

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

  • ⌘↩
  • ⇧↩
这些组合中的每一个都将得到不同的响应

理想情况下,我希望通过IB来实现这一点。然而,我的理解是Cocoa只允许每个控件发送一个操作

我可以将此已发送的操作绑定到
iAction
,并将
NSTextField
设置为仅在按下返回键时发送,但我找不到方法获取当前按下的修改器键(因为该操作只接收
(id)发送方
,而不是事件对象)。可能吗

或者,我想可以将
NSTextField
子类化,覆盖
keyDown:
,并手动运行适当的操作。然而,我想不出如何在IB中正确地连接这一点。(我可以使用
IBOutlet
作为目标,但我想不出一种连接特定方法的方法。)我还担心这种方法的效率

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


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

@property (weak, nonatomic) IBOutlet id<TextFieldReturnHandler> target
@property(弱、非原子)IBOutlet id目标

然后可以通过按键事件调用。不过,这似乎很复杂。

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

- (IBAction)cellDidEndEditing:(id)sender;
如果您只希望在按下返回键时调用此方法,而不希望在用户单击时调用此方法,则可以将IB中NSTextField上的Action属性设置为“仅在回车时发送”,而不是“结束编辑时发送”

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

NSEvent *evt = [NSApp currentEvent];
检查事件是否有效后,可以获取必要的修改器标志并对其执行操作:

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

    // Perform actions
}

在带有修改器标志的enter键上不会调用该操作。