objective-c – 查看interpretKeyEvents:但是在响应者链中传递不需要的东西?

objective-c – 查看interpretKeyEvents:但是在响应者链中传递不需要的东西?,第1张

概述我真的很喜欢我的自定义视图使用-moveLeft:, – deleteForward:, – selectAll:等等,但我也想传递任何我不关心的响应链上的键.现在我正在覆盖-keyDown:调用[self interpretKeyEvents:[NSArray arrayWithObject:event]] ;,但这似乎占用了所有关键事件,即使我的视图没有响应. 有没有办法在链上传递不需要的事件 我真的很喜欢我的自定义视图使用-moveleft:,– deleteForward:,– selectAll:等等,但我也想传递任何我不关心的响应链上的键.现在我正在覆盖-keyDown:调用[self interpretKeyEvents:[NSArray arrayWithObject:event]] ;,但这似乎占用了所有关键事件,即使我的视图没有响应.

有没有办法在链上传递不需要的事件,但仍然会响应-moveleft:等等?或者我需要在-keyDown中实现我自己的所有 *** 作:这样我才知道我做了什么而没有回应?

解决方法 碰到这个试图找到解决同样问题的方法.从来没有在网上找到任何东西,但我想出了迄今为止似乎运作良好的东西.这是我正在做的事情:

对您的NSTextVIEw(或您正在使用的任何内容)进行子类化,并创建一个实例变量来临时存储按键事件. . .

@interface MyTextVIEw : NSTextVIEw {    NSEvent* _keyDownEvent;}@end

然后像这样定义你的视图的方法(如果你使用自动引用计数,取出保留/释放垃圾):

@implementation MyTextVIEw- (ID)initWithFrame:(NSRect)frame {    if (self = [super initWithFrame:frame]) {        _keyDownEvent = nil;    }    return self;}- (voID)keyDown:(NSEvent*)event {    [_keyDownEvent release];    _keyDownEvent = [event retain];    [super keyDown:event];}- (voID)doCommandBySelector:(SEL)selector {    if (_keyDownEvent && selector == @selector(noop:)) {        if ([self nextResponder]) {            [[self nextResponder] keyDown:[_keyDownEvent autorelease]];        } else {            [_keyDownEvent release];        }        _keyDownEvent = nil;    } else {        [super doCommandBySelector:selector];    }}- (voID)dealloc {    [_keyDownEvent release];    [super dealloc];}@end

这是我如何到达这一点.如果未按下按键,您会听到哔哔声.所以,我在NSBeep()上设置了一个断点,当程序崩溃时,我在GDB中吐出一个堆栈跟踪:

#0  0x00007fff96eb1c2d in NSBeep ()#1  0x00007fff96e6d739 in -[NSResponder doCommandBySelector:] ()#2  0x00007fff96e6d72b in -[NSResponder doCommandBySelector:] ()#3  0x00007fff96fda826 in -[NSWindow doCommandBySelector:] ()#4  0x00007fff96e6d72b in -[NSResponder doCommandBySelector:] ()#5  0x00007fff96e6d72b in -[NSResponder doCommandBySelector:] ()#6  0x00007fff96e6d72b in -[NSResponder doCommandBySelector:] ()#7  0x00007fff96e6d72b in -[NSResponder doCommandBySelector:] ()#8  0x00007fff96e6d72b in -[NSResponder doCommandBySelector:] ()#9  0x00007fff96e6d72b in -[NSResponder doCommandBySelector:] ()#10 0x00007fff96e6d72b in -[NSResponder doCommandBySelector:] ()#11 0x00007fff96f486ce in -[NSTextVIEw doCommandBySelector:] ()#12 0x00007fff96da1c93 in -[NSKeyBindingManager(NSKeyBindingManager_MultiClIEnts) interpretEventAsCommand:forClIEnt:] ()#13 0x00007fff970f5382 in -[NSTextinputContext handleEvent:] ()#14 0x00007fff96fbfd2a in -[NSVIEw interpretKeyEvents:] ()#15 0x00007fff96f38a25 in -[NSTextVIEw keyDown:] ()#16 0x0000000100012889 in -[MyTextVIEw keyDown:] (self=0x1004763a0,_cmd=0x7fff972b0234,event=0x100197320) at /path/MyTextVIEw.m:24#17 0x00007fff96a16b44 in -[NSWindow sendEvent:] ()#18 0x00007fff969af16d in -[NSApplication sendEvent:] ()#19 0x00007fff969451f2 in -[NSApplication run] ()#20 0x00007fff96bc3b88 in NSApplicationMain ()#21 0x00000001000015e2 in main (argc=3,argv=0x7fff5fbff8f0) at /path/main.m:12

发生的事情是:当按键事件不用于文本输入时,响应链上会发送“noop”命令.默认情况下,当它从响应链中掉落时会触发蜂鸣声.在我的解决方案中,NSTextVIEw子类捕获noop命令,而是将原始keyDown事件抛出响应链.然后您的NSWindow或其他视图将正常获取任何未使用的keyDown事件.

总结

以上是内存溢出为你收集整理的objective-c – 查看interpretKeyEvents:但是在响应者链中传递不需要的东西?全部内容,希望文章能够帮你解决objective-c – 查看interpretKeyEvents:但是在响应者链中传递不需要的东西?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1002909.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存