Objective c 在视图控制器中处理发送给第一响应者的消息

Objective c 在视图控制器中处理发送给第一响应者的消息,objective-c,cocoa,nsview,first-responder,nsviewcontroller,Objective C,Cocoa,Nsview,First Responder,Nsviewcontroller,我一定错过了一些简单的东西,但我看不到。首先,设置: DATreeView,是NSView DATreeViewController,是NSViewController main menu.xib有一个DATreeViewController的实例,该实例配置为从DATreeView.xib main menu.xib还有一个dendereappdelegate的实例,它有一个DATreeViewController出口(连接到main menu.xib的DATreeViewControlle

我一定错过了一些简单的东西,但我看不到。首先,设置:

  • DATreeView
    ,是
    NSView
  • DATreeViewController
    ,是
    NSViewController
  • main menu.xib
    有一个
    DATreeViewController
    的实例,该实例配置为从
    DATreeView.xib
  • main menu.xib
    还有一个
    dendereappdelegate
    的实例,它有一个
    DATreeViewController
    出口(连接到
    main menu.xib
    DATreeViewController
    实例)
  • 做点什么!
    ,一个连接起来的菜单项,用于向第一响应者发送
    doSomething:
    消息
  • 并非巧合,
    DATreeViewController
    有一个名为
    doSomething:
    的操作
我想要的是让
做点什么!
菜单项触发
doSomething:
DATreeViewController
执行操作,让我们假装我不能直接设置目标/操作连接。我会停在这里问,我的设计完全错了吗?我试图执行的愚蠢/邪恶/可能会让我感到羞耻吗那是我的上帝

不?太好了。现在,就我个人而言,我无法激活菜单项。我在雪豹上做这件事,如果这有什么区别的话

为了实现
NSView
NSViewController
之间的良好集成,例如管理响应者链,我遵循了一个实质性的改变:在NIB加载过程中,
NSView
似乎没有收到
setViewController:
消息,所以我自己在
DATr中发送该消息eeViewController的
loadView
消息。据我所知,在
ApplicationIDFinishLaunching中运行以下代码后:

NSView *view = self.treeViewController.view;
[self.window.contentView addSubview:view];
响应者链按预期设置,即:

NSWindow < NSView < DATreeViewController < DATreeView
NSWindow
我的期望是,作为
DATreeViewController
是响应者链的一部分,作为响应
doSomething:
,并且由于它没有实现验证,我所要做的就是使用Interface Builder将
do someth!
菜单项连接到第一响应者代理,使用
doSomething:
作为其操作,菜单项将自动激活


我做错了什么?谢谢大家宝贵的帮助!

您的视图是否接受并成功成为第一响应者?

DATreeViewController是否连接到IB中DATreeView的viewController插座


您是否跟踪了setViewController:和setNextResponder:以验证是否正确设置了nextResponder?

响应程序链仅适用于
nsrresponder
超类中的消息,例如
mouseDown
mouseExited
等。我相信,您可以通过向
NSRe添加一个类别来做一些偷偷摸摸的事情sponder
通过查看
nextResponder
并在存在
nextResponder
的情况下向上发送消息来冒泡其他方法


这似乎是这种技术的一个例子:

Ah!因为动作在视图控制器中,所以我在这里重写了-acceptsFirstResponder。但是视图控制器不在视图层次结构中!谢谢!事实证明比这更简单。因为动作在视图控制器中,所以我在这里重写了-acceptsFirstResponder但是Cocoa只查看响应者的视图层次结构,DAView不接受第一响应者。。。