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不接受第一响应者。。。