【发布时间】:2010-09-05 21:26:32
【问题描述】:
我正在慢慢学习 Objective-C 和 Cocoa,到目前为止我看到的在文本视图中捕获关键事件的唯一方法是使用委托,但我很难找到有用的文档和如何实现此类的示例一个解法。谁能指出我正确的方向或提供一些第一手帮助?
【问题讨论】:
标签: objective-c cocoa events
我正在慢慢学习 Objective-C 和 Cocoa,到目前为止我看到的在文本视图中捕获关键事件的唯一方法是使用委托,但我很难找到有用的文档和如何实现此类的示例一个解法。谁能指出我正确的方向或提供一些第一手帮助?
【问题讨论】:
标签: objective-c cocoa events
通常,您实现它的方式只是将所需的功能添加到视图的控制器中,并设置其委托。例如,如果您希望代码在视图加载时运行,您只需将视图委托给控制器,并实现 awakeFromNib 函数。
因此,要检测文本视图中的按键,请确保您的控制器是文本视图的委托,然后实现:
- (void)keyUp:(NSEvent *)theEvent
注意这是继承的 NSResponder 方法,而不是 NSTextView 方法。
【讨论】:
告诉我们您真正想要实现的目标很重要——您认为在 NSTextView 中捕获关键事件将解决的更高级别的目标。
例如,当有人问我如何在 NSTextField 中捕获关键事件时,他们真正想知道的是如何验证该字段中的输入。这是通过将字段的格式化程序设置为 NSFormatter 实例(无论是 Cocoa 中包含的格式化程序之一还是自定义格式化程序),而不是直接处理击键来完成的。
那么给出这个例子,你真正想要完成什么?
【讨论】:
我已经进行了一些艰苦的挖掘,并且确实找到了自己问题的答案。我会在下面得到它,但感谢两个回答的家伙。我认为 Stack Overflow 已经是一个很棒的网站——我希望更多的 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 提供给你的高亮代码。
【讨论】: