我想使用cocoa向另一个对象发送一个动作。理想情况下,我还希望它出现在“界面”构建器中。
我已经尝试了苹果文档,但有些东西我不见了。添加以下内容后,界面构建仅将操作显示为已接收的操作。
- (IBAction)setTarget:(id)anObject;
- (IBAction)setAction:(SEL)aSelector;
有人可以给我一个如何创建已发送动作的示例。感谢
我在controller1中定义了接收操作。然后我希望我的controller2能够向controller1发送一个动作(就像NSButton那样)。在界面构建中,您可以将一行FROM NSButton拖到应该接收信号的控件上。此功能不仅限于那里的苹果对象,必须是一种方法。
答案 0 :(得分:18)
IBAction
是一个预处理器指令,告诉Interface Builder“这是你应该知道的。”它实际上评估为void
。这意味着“行动”只是您可以正常方式调用的常规方法:
[target someMethod:self];
如果你想模仿你可以从NSButton
获得的行为,你可以为目标添加一个出口,为选择器添加一个属性(作为一个字符串):
@property (nonatomic, retain) IBOutlet id target;
@property (nonatomic, retain) NSString* actionSelectorString;
然后你可以这样打电话:
SEL action = NSSelectorFromString(self.actionSelectorString);
[self.target performSelector:action withObject:self];
如果您希望您的类通过在Interface Builder中拖放来连接选择器,最简单的方法是使您的类成为NSControl
的子类(从对象库中拖出自定义视图, Command-6显示检查器,在顶部弹出窗口中选择您的类。然后,您可以通过以下方式“呼叫”该操作:
- (void) go {
[self sendAction:self.action to:self.target];
}
答案 1 :(得分:1)
NSButton是一个NSControl,因此有一个“动作”可以连线 - 当你触发控件时发送的消息(例如,点击一个按钮)。控制器没有动作(这意味着什么 - 你将如何导致消息被发送?),所以你想要做的事实际上没有意义。
如果你想让controller2能够让controller1做某事,你应该在controller2上创建一个插座(类型为controller1,或者它实现的某个接口),将它连接到IB中的controller1,然后你就可以发送任何消息了想以编程方式从controller2到controller1。
答案 2 :(得分:1)
如果Controller2
类是NSControl
的子类,您应该能够这样做。 NSControl
定义了一个“已发送的操作”,当您从Interface Builder中的NSButton
拖动时,它就是您连接到目标对象的内容。话虽如此,IB 3.0中存在(是?)一个错误,阻止了发送的动作出现在IB中。有关详细信息,请参阅this cocoa-dev thread。
答案 3 :(得分:1)
controller1和controller2是NSControl的子类。
[controller2 sendAction:@selector(receiveAction:) to:controller1];
答案 4 :(得分:0)
操作始终由对象接收。如果你想向另一个方向发送信息,你可能想要一个出口:寻找IBOutlet。