为什么NSWindow或NSView实例会处理自己的键事件,而不是它的委托?

时间:2009-06-20 20:22:52

标签: objective-c cocoa

作为Cocoa的新手,我很难理解为什么通用的NSResponder子类以他们的方式实现关键事件。

在我的程序中,我有一个NSWindow子类占用了整个屏幕,并且必须处理关键事件。有几个主要的命令可以改变程序的整个状态(例如,当用户点击空格键时暂停一个计时器),如果有像NSTextField句柄这样的子视图是没有意义的。

在我看来,委托人(控制人)应该得到这些事件。相反,我发现我必须编写一堆杂乱的胶水代码让窗口(通过其keyDown:interpretKeyEvents:选择器)通知控制器,或者我只需要移动一堆控制器代码到NSWindow子类本身。

这很乱,我的直觉告诉我,我错过了什么。有更清洁的解决方案吗?

1 个答案:

答案 0 :(得分:4)

如果您已正确设置,NSWindow的委托将收到消息。 Cocoa使用响应者链来转发来自第一响应者的消息 - 关键消息的关键视图,以及被点击/悬停/等的视图。对于鼠标消息 - 通过超视图,通过窗口,最后到窗口的委托。在Apple's site上有一个非常好的典型响应者链图。

你真的不应该继承NSWindow的子类,除非你实现了一些奇特的窗口绘图或其他类似的东西。 Cocoa提供NSWindowController类来充当窗口及其内容的控制器。

通常的模式是子类NSWindowController并将IBOutlet添加到其中,然后使用NIB来布置窗口内容。您将NSWindowController子类设置为Interface Builder中文件所有者代理的类。并且您还将窗口的delegate分配给窗口控制器,以便它可以成为响应器链的一部分。最后,要创建窗口,可以使用NSWindowController的{​​{1}}方法,该方法使用新的窗口控制器作为文件的所有者自动加载NIB。

我建议您阅读Cocoa文档中的窗口控制器,因为它们提供了您正在寻找的缺失链接。