代码之家  ›  专栏  ›  技术社区  ›  sergtk

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

  •  15
  • sergtk  · 技术社区  · 18 年前

    我正在慢慢学习objective-c和cocoa,到目前为止,在文本视图中捕获关键事件的唯一方法是使用委托,但在如何实现这种解决方案方面,我很难找到有用的文档和示例。有人能指点我正确的方向或提供一些第一手帮助吗?

    4 回复  |  直到 18 年前
        1
  •  14
  •   TheSmurf    18 年前

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

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

    - (void)keyUp:(NSEvent *)theEvent
    

    请注意,这是继承的nsresponder方法,而不是nstextview方法。

        2
  •  10
  •   alextgordon    18 年前

    只需突出显示语法提示:

    不要同时突出显示整个文本视图-它是 非常 慢。另外,不要使用-editedrange突出显示上次编辑的文本,如果用户将大量文本粘贴到文本视图中,也会非常慢。

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

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

    然后将VisibleRange输入突出显示的代码。

        3
  •  2
  •   Chris Hanson    18 年前

    重要的是告诉我们您真正想要实现更高层次的目标,您认为在nstextview中捕获关键事件可以解决这个问题。

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

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

        4
  •  1
  •   sergtk    18 年前

    我已经做了一些艰苦的挖掘,我找到了我自己问题的答案。我在下面说,不过多亏了两个回答的人。我认为栈溢出已经是一个很好的站点了——我希望更多的Mac开发者在测试版结束后能找到他们的方法——这对于其他想要过渡到平台的开发者来说可能是一个很好的资源。

    所以,我按照丹尼的建议,在代表团中找到了我的答案。我从丹尼的文章中没有理解的是,在委托对象中有一组启用委托的方法,并且委托必须实现所述事件。所以对于一个textview,我能够找到textdidchange方法,它以一种比简单捕获按键更好的方式完成了我想要的事情。因此,如果我在控制器中实现这一点:

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

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