1

我有一个带有状态菜单的 Mac OS 应用程序(在 Interface Builder 中制作)。我想在某些事件发生时更改状态菜单项标题。我可以在动作处理程序中很好地做到这一点,因为我有一个对那里的项目的引用(sender):

- (IBAction)playPauseMusic:(id)sender {
  // ...
  [sender setTitle:@"New Title"];
}

但是如何在我的应用程序的其他部分做到这一点?我不知道如何menuItem在以下代码中获得引用:

- (void) someOtherMethod:(int)isPlaying {
    menuItem = ...;
    if(isPlaying) {
        [menuItem setTitle:@"Pause"];
    }
}

怎么做才能使上述工作?

更新。这是我附加状态菜单的方法:

// MyAppDelegate.h:

@interface MyApp : NSApplication
@end

@interface MyAppDelegate : NSObject <NSApplicationDelegate>
{
  NSMenu *statusMenu;
  NSStatusItem *statusItem;
  // ...
}
@property (strong) IBOutlet NSMenu *statusMenu;
// ...
@end

// MyAppDelegate.m:

@synthesize statusMenu;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    statusItem = [[NSStatusBar systemStatusBar]
        statusItemWithLength:NSVariableStatusItemLength];
    [statusItem setMenu:[self statusMenu]];
}
4

2 回答 2

2

如果要访问菜单中的项目,请在菜单项上设置标签(例如在 IB 中)并使用:

NSMenuItem *menuItem = [[statusItem menu] itemWithTag:100];    // 100 = example
menuItem.title = @"Something";

如果要设置标题的代码与保存的对象不同,statusItem那么您需要公开一个setStatusMenuTitle:forItemWithTag:执行上述代码的方法。

但是,如果没有更多详细信息,我无法告诉您如何访问对象。

于 2013-09-10T12:25:27.627 回答
1

首先,我为Xcode中的菜单项创建了一个出口。我按照“创建并连接新插座”视频指南进行操作。我strong为我的菜单项做了一个出口:

@property (strong) IBOutlet NSMenuItem *playMenuItem;

然后将其添加到界面中:

@interface MyAppDelegate ...
{
    // ...
    NSMenuItem *playMenuItem;
}

然后@synthesize在实现中添加声明:

@synthesize playMenuItem;

最后,以下工作:

[playMenuItem setTitle:@"New Title"];

PS如果有人能告诉我如何使它更简单,我将不胜感激。

于 2013-09-10T12:34:20.080 回答