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

时间:2008-08-14 16:32:23

标签: objective-c cocoa events

我正在慢慢学习Objective-C和Cocoa,到目前为止我看到的唯一方法是捕获文本视图中的关键事件是使用委托,但我找不到有用的文档和如何实现这些的示例一个办法。任何人都可以指出我正确的方向或提供一些第一手帮助?

4 个答案:

答案 0 :(得分:14)

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

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

- (void)keyUp:(NSEvent *)theEvent

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

答案 1 :(得分:10)

只是语法高亮的提示:

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

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

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

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

答案 2 :(得分:2)

告诉我们您真正想要实现的目标非常重要 - 您认为捕获NSTextView中的关键事件的更高级别目标将会解决。

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

所以,举个例子,你真正想要完成什么?

答案 3 :(得分:1)

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

所以,按照Danny的建议,我在代表团中找到了答案。我在Danny的帖子中没有理解的是委托对象中有一组支持委托的方法,并且委托必须实现所述事件。因此对于TextView,我能够找到textDidChange方法,它以一种更好的方式完成了我想要的工作,而不仅仅是捕获按键操作。所以如果我在我的控制器中实现它:

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

我可以回复正在编辑的文字。当然还有其他可用的方法,我很高兴和他们一起玩,因为我知道我会像我一样学到很多东西。再次感谢,伙计们。