如何从Objective C / Cocoa中的View类事件调用Controller类(委托)方法

时间:2011-11-17 16:13:18

标签: objective-c cocoa

假设我有一个NSWindow类,它有几个鼠标和触控板移动事件 例如这段代码

恕我直言,我认为这应该是很好的编程,它类似于将一个按钮的动作指向控制器中的方法。 在我的MyWindow.m类中(我在IB中设置了窗口类)


@implementation MyWindow
- (void)swipeWithEvent:(NSEvent *)event {
NSLog(@"Track Pad Swipe Triggered");
/* I want to add something like this
   Note that, Appdelegate should be existing delegate, 
not a new instance, since I have variables that should be preserved*/
[AppDelegate setLabel];
}   
@end

在我的AppDelegate.h中我有

@interface AppDelegate : NSObject <NSApplicationDelegate>
{
IBOutlet NSTextField *label;
}
-(void)setLabel;
@end

在我的AppDelegate.m中我有

-(void)setLabel
{
[label setStringValue:@"swipe is triggered"];
}

我尝试了#import @class,[[... alloc] init],在IB中委托引用(我创建了MyWindow的对象类 - 感谢上一个问题的答案) 后者似乎是最接近的一个,如果两个类都是委托,它可以工作,所以我可以成功地从第二个控制器(委托类)的IBAction方法中的按钮调用“setLabel”动作, 但是这个View事件看起来似乎没有与代理的动作进行通信,尽管他们的代码正在执行。

1 个答案:

答案 0 :(得分:1)

您正在向AppDelegate类发送消息,而不是可从NSApplication单例([NSApplication sharedApplication])

访问的AppDelegate类实例
[AppDelegate setLabel];

这是错误的,让代表这样做:

AppDelegate* appDelegate = (AppDelegate*)[[NSApplication sharedApplication] delegate];

然后将消息发送到该实例:

[appDelegate setLabel];