Cocoa 对于某些按键,performKeyEquivalent调用两次
按“Command+”将导致两个性能相当的调用。以下是第一次调用的堆栈跟踪片段:Cocoa 对于某些按键,performKeyEquivalent调用两次,cocoa,Cocoa,按“Command+”将导致两个性能相当的调用。以下是第一次调用的堆栈跟踪片段: 1 AppKit 0x00007fff903da2f9 -[NSView _performKeyEquivalent:conditionally:] + 41 2 AppKit 0x00007fff903da442 -[NSView performKeyEquivalent:] + 166 3
1 AppKit 0x00007fff903da2f9 -[NSView _performKeyEquivalent:conditionally:] + 41
2 AppKit 0x00007fff903da442 -[NSView performKeyEquivalent:] + 166
3 AppKit 0x00007fff903da2f9 -[NSView _performKeyEquivalent:conditionally:] + 41
4 AppKit 0x00007fff903da259 -[NSWindow performKeyEquivalent:] + 64
5 AppKit 0x00007fff903da044 -[NSApplication _handleKeyEquivalent:] + 462
6 AppKit 0x00007fff90297173 -[NSApplication sendEvent:] + 4480
第二个电话:
1 AppKit 0x00007fff903da2f9 -[NSView _performKeyEquivalent:conditionally:] + 41
2 AppKit 0x00007fff903da442 -[NSView performKeyEquivalent:] + 166
3 AppKit 0x00007fff903da2f9 -[NSView _performKeyEquivalent:conditionally:] + 41
4 AppKit 0x00007fff903da259 -[NSWindow performKeyEquivalent:] + 64
5 AppKit 0x00007fff903da044 -[NSApplication _handleKeyEquivalent:] + 462
6 AppKit 0x00007fff900e3927 -[NSApplication _handleSpecialAlternateKeyEquivalent:] + 656
7 AppKit 0x00007fff9029718e -[NSApplication sendEvent:] + 4507
如您所见,第二个-performKeyEquivalent调用由-[NSApplication\u handleSpecialAlternateKeyEquivalent:]发起。那么,有谁能告诉我“Command+”键笔划有什么特别之处,它保证了不是一个而是两个性能相同的调用,以及如何过滤第二个调用?最可能的原因是第一个调用返回了
NO
,因此AppKit会使用稍微不同的事件再次尝试。您是否覆盖了性能等价:
?您是否第一次返回否
注释来自: 不鼓励NSWindow子类重写performKeyEquivalent:。 注意:从OS X v10.5开始,如果无法识别密钥等效项,NSWindow会将其作为NSKeyDown事件发送给第一响应者。此行为使用命令键修饰符启用自定义键绑定项。此外,NSApplication通过performKeyEquivalent:将控制键事件作为NSKeyDown事件通过响应程序链发送到键窗口。此行为允许更可靠地使用控件键事件作为菜单键等效项
最有可能的原因是第一次调用返回了
NO
,因此AppKit会再次尝试使用稍微不同的事件。您是否覆盖了性能等价:
?您是否第一次返回否
注释来自: 不鼓励NSWindow子类重写performKeyEquivalent:。 注意:从OS X v10.5开始,如果无法识别密钥等效项,NSWindow会将其作为NSKeyDown事件发送给第一响应者。此行为使用命令键修饰符启用自定义键绑定项。此外,NSApplication通过performKeyEquivalent:将控制键事件作为NSKeyDown事件通过响应程序链发送到键窗口。此行为允许更可靠地使用控件键事件作为菜单键等效项
是的,我两次都返回“否”。这是我无法改变的(当然,我可以,但由于一些技术原因,我不想改变)。当每个击键只有一个调用-performKeyEquivalent时,一切都很好(大多数击键都是这样)。第二个电话把事情搞砸了。到目前为止,Cmd+是我所知道的唯一能产生这种效果的按键。我想知道为什么Cocoa的处理方式不同。是的,我两次都返回“否”。这是我无法改变的(当然,我可以,但由于一些技术原因,我不想改变)。当每个击键只有一个调用-performKeyEquivalent时,一切都很好(大多数击键都是这样)。第二个电话把事情搞砸了。到目前为止,Cmd+是我所知道的唯一能产生这种效果的按键。我想知道Cocoa为什么会有不同的处理方式。