【问题标题】:@selector - How to call a method from another class?@selector - 如何从另一个类调用方法?
【发布时间】:2012-08-23 20:51:23
【问题描述】:

我通过 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
}

【问题讨论】:

  • 这会打印出什么吗?
  • 是的,它到达“in 1”,但永远不会到“in 2”。 _kbAppController 为空!我删除了属性和@synthesize 语句,它现在可以工作了。

标签: objective-c cocoa


【解决方案1】:

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

只要确保您首先设置并初始化 NSMenuItem。现在你在一个未初始化的对象上调用-setAction

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢,我编辑我的问题以包含新代码。它仍然没有从另一个类调用该方法。我在哪里搞砸了?
    • showPreferencesPanel 中设置断点,看看_kbAppController 是否不为零
    • 好的,我创建了一个 KBAppController 的实例,我没有将它设置为属性。我删除了@synthesize,它现在可以工作了。我很困惑为什么它不能作为财产。
    • 等等。为什么不将其添加为属性?
    • 我在 KBStatisMenu.h 中定义了一个实例:KBAppController *kbAppController,并删除了@property(和@synthesize)。出于某种原因,当我保留这些语句时,我在 .m 文件中的 kbAppController 对象最终是 nil,因此它不会调用任何东西!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 2019-08-16
    相关资源
    最近更新 更多