@selector - 如何从另一个类调用方法?

时间:2012-08-23 20:51:23

标签: objective-c cocoa

我通过Interface Builder创建了一个NSMenu。其中一个名为showPreferencesPanel方法的菜单项,在KBAppController.m中定义:

-(void)showPreferencesPanel {
    //something
}

现在,我必须以编程方式重新构建没有IB的菜单。 StatusMenu.m是处理所有这些的类,我无法弄清楚我应该设置的目标,以便从另一个类调用一个方法。

创建该类的实例不起作用!菜单项显示为灰色。

StatusMenu.m

KBAppController *kbAppController = [[KBAppController alloc]init];
NSMenuItem* preferencesItem;
[preferencesItem setTarget:kbAppController];
preferencesItem = [[NSMenuItem alloc] initWithTitle:@"Preferences…" action:@selector(showPreferencesPanel) keyEquivalent:@""];

编辑:------------------------------------------ -

以下是使用类KBAppController对象的更新代码。好消息是prefs菜单项已启用,但它仍然没有调用KBAppController.m中的方法:(

KBStatusMenu.m

@synthesize kbAppController = _kbAppController;

someMethod {   
NSMenuItem* preferencesItem;
preferencesItem = [[NSMenuItem alloc] initWithTitle:@"Preferences…" action:@selector(showPreferencesPanel) keyEquivalent:@""];
[preferencesItem setTarget:self];
}

- (void)showPreferencesPanel {
NSLog(@"in 1");
[_kbAppController showPreferencesPanel];
}

KBAppController.m

-(void)showPreferencesPanel {
    NSLog(@"in 2");
    //something
}

2 个答案:

答案 0 :(得分:1)

NSMenuItem有一个- (void)setTarget:(id)anObject- (void)setAction:(SEL)aSelector应该可以做到这一点。

请确保先设置并初始化NSMenuItem。现在你在未初始化的对象上调用-setAction

preferencesItem = [[NSMenuItem alloc] initWithTitle:@"Preferences…" action:@selector(showPreferencesPanel) keyEquivalent:@""];
[preferencesItem setTarget:kbAppController]

答案 1 :(得分:0)

selector从您的班级调用该方法。在该方法中,使用showPreferencePanel()对象调用KBAPPController

确保将KBAppController的对象设置为StatusMenu的属性。