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