2011-12-26 34 views
0

在我的Cocoa应用程序中的应用程序菜单上有一个菜单项“删除”,它发送一个delete:消息给第一响应者。现在,我的键盘集中在NSOutlineView,这是本例中的第一个响应者。短的子类NSOutlineView,有没有办法处理传递给它的delete:消息? NSOutlineViewDelegateNSOutlineViewDataSource协议似乎都没有为处理这些操作定义任何有趣的事情。是否有NSResponder委托这样的事情?

+0

您对子类别有什么异议?这很简单,将实现你想要的。 – 2011-12-26 23:30:56

+0

它当然可以达到结果,但是处理这些胶水元素似乎是控制器而不是视图的角色。此外,由于Cocoa严重提倡委托模式,我认为可能有一些内置委托来处理这些任务。 – Tony 2011-12-26 23:34:44

回答

2

第一响应者正是这样的:第一个响应者。它会将任何不感兴趣的东西转发给其响应者,并且可能会依次转发,直到消息到达应用程序对象。

因此,您只需在响应者链中处理此消息即可。窗口控制器是一个很好的方法来做到这一点;它将成为窗口的下一个响应者。

参见“Event Architecture” in the Event-Handling Guide

+1

从体系结构的角度来看,让窗口控制器处理表格/大纲视图本地的“复制”,“粘贴”和“删除”事件似乎并不麻烦?看来这些方法最好由视图绑定的数组/树控制器或视图的委托处理,但NSArrayController和NSTreeController不是NSResponders并且不能位于响应者链中,有什么建议? – Tony 2011-12-26 20:54:21

+1

您始终可以使用自定义的“NSViewController”对象来管理每个单独的视图,并在响应者链中插入视图控制器。然后视图控制器可以处理复制和粘贴等。 – 2011-12-26 23:29:49

+0

@Tony:如果窗口控制器是或知道拥有数据的对象(如文档),则不需要。窗口控制器几乎存在于视图和窗口与模型控制器之间的中间。如果视图处理剪切,复制,粘贴和删除(通过绑定或数据源消息),那么最好是这样,但除非您想创建一个添加该视图的子类,否则它不会。 – 2011-12-26 23:36:02

相关问题