在 NSTextView 中捕获关键事件的最佳方式?

Best way to capture key events in NSTextView?

提问人:Brian Warshaw 提问时间:8/15/2008 最后编辑:CommunityBrian Warshaw 更新时间:11/20/2015 访问量:6685

问:

我正在慢慢学习 Objective-C 和 Cocoa,到目前为止,我看到在文本视图中捕获关键事件的唯一方法是使用委派,但我很难找到有关如何实现此类解决方案的有用文档和示例。谁能为我指出正确的方向或提供一些第一手的帮助?

Objective-C Cocoa 事件

评论


答:

14赞 TheSmurf 8/15/2008 #1

通常,实现它的方式只是将所需的函数添加到视图的控制器中,并设置其委托。例如,如果希望代码在视图加载时运行,只需将视图委托给控制器,然后实现 awakeFromNib 函数。

因此,若要检测文本视图中的按键,请确保控制器是文本视图的委托,然后实现以下操作:

- (void)keyUp:(NSEvent *)theEvent

请注意,这是继承的 NSResponder 方法,而不是 NSTextView 方法。

评论

1赞 Bob Murphy 3/21/2014
如果将 keyUp 放在委托中,则不会调用它。您必须将 NSTextView 子类化并将其放在那里。
2赞 Chris Hanson 8/15/2008 #2

重要的是要告诉我们您真正想要完成的目标 - 您认为在 NSTextView 中捕获关键事件将解决的更高级别的目标。

例如,当有人问我如何捕获 NSText 字段中的关键事件时,他们真正想知道的是如何验证字段中的输入。这是通过将字段的格式化程序设置为 NSFormatter 的实例(无论是 Cocoa 中包含的格式化程序之一还是自定义格式化程序)来完成的,而不是通过直接处理击键来完成的。

那么,鉴于这个例子,你真正想完成什么?

1赞 Brian Warshaw 8/16/2008 #3

我做了一些艰苦的挖掘,我确实找到了我自己问题的答案。我会在下面介绍它,但感谢回复的两个家伙。我认为 Stack Overflow 已经是一个很棒的网站——我希望更多的 Mac 开发人员在测试版结束后找到自己的方式——对于其他希望过渡到该平台的开发人员来说,这可能是一个很好的资源。

所以,正如丹尼所建议的那样,我确实在委托中找到了答案。我从 Danny 的帖子中不明白的是,委托对象中有一组启用委托的方法,并且委托必须实现所述事件。因此,对于 TextView,我能够找到 textDidChange 方法,它以比简单地捕获按键更好的方式完成了我想要的东西。因此,如果我在我的控制器中实现这一点:

- (void)textDidChange:(NSNotification *)aNotification;

我可以对正在编辑的文本做出回应。当然,还有其他方法可用,我很高兴能用它们来玩,因为我知道我会学到很多东西。再次感谢,伙计们。

10赞 alextgordon 8/16/2008 #4

只是语法高亮的提示:

不要一次突出显示整个文本视图 - 它非常慢。此外,不要使用 -editedRange 突出显示上次编辑的文本 - 如果用户将大量文本粘贴到文本视图中,则速度也会非常慢。

相反,您需要突出显示可见文本,如下所示:

NSRect visibleRect = [[[textView enclosingScrollView] contentView] documentVisibleRect];
NSRange visibleRange = [[textView layoutManager] glyphRangeForBoundingRect:visibleRect inTextContainer:[textView textContainer]];

然后,将 visibleRange 提供给突出显示代码。