捕获NSTextView中关键事件的最佳方法?
我正在慢慢学习Objective-C和Cocoa,到目前为止,我看到的唯一在Text Views中捕获关键事件的方法是使用委托,但是我很难找到有用的文档和有关如何实现此解决方案的示例。谁能向我指出正确的方向或者提供一些第一手的帮助?
解决方案
回答
通常,实现它的方法只是将所需的函数添加到视图的控制器,然后设置其委托。例如,如果要在视图加载时运行代码,则只需将视图委托给控制器,并实现awakeFromNib函数。
因此,要检测文本视图中的按键,请确保控制器是文本视图的委托,然后实施此操作:
- (void)keyUp:(NSEvent *)theEvent
请注意,这是一个继承的NSResponder方法,而不是NSTextView方法。
回答
重要的是要告诉我们我们实际上是想实现更高的目标,我们认为在NSTextView中捕获关键事件将解决该目标。
例如,当有人问我如何捕获NSTextField中的关键事件时,他们真正想知道的是如何验证字段中的输入。可以通过将字段的格式化程序设置为NSFormatter的实例(无论是可可中包含的一种格式化程序还是自定义的格式化程序)来完成,而不是直接处理击键操作。
因此,以该示例为例,我们真正想要实现的目标是什么?
回答
我做了一些艰苦的工作,确实找到了我自己问题的答案。我将在下面进行介绍,但是要感谢两个家伙的回答。我认为Stack Overflow已经是一个了不起的网站-我希望Beta测试结束后更多Mac开发人员可以进入他们的网站-对于其他希望过渡到该平台的开发人员来说,这可能是一个很好的资源。
因此,按照丹尼(Danny)的建议,我确实在代表团中找到了我的答案。我从Danny的帖子中不了解的是,委托对象中有一组启用委托的方法,并且委托必须实现上述事件。因此,对于TextView,我能够找到方法textDidChange,该方法以比仅捕获按键就更好的方式实现了我想要的功能。因此,如果我在控制器中实现此功能:
- (void)textDidChange:(NSNotification *)aNotification;
我可以回复正在编辑的文本。当然,还有其他可用的方法,我很高兴与他们一起玩,因为我知道我会学到很多东西。再次感谢你们。
回答
语法高亮提示:
不要立即突出显示整个文本视图,因为它非常慢。另外,不要使用-editedRange突出显示最后编辑的文本,如果用户将大量文本粘贴到文本视图中,这也会非常慢。
相反,我们需要突出显示可见的文本,如下所示:
NSRect visibleRect = [[[textView enclosingScrollView] contentView] documentVisibleRect]; NSRange visibleRange = [[textView layoutManager] glyphRangeForBoundingRect:visibleRect inTextContainer:[textView textContainer]];
然后,将visibleRange输入到突出显示的代码中。