如何在Objective-C上的状态菜单中更新菜单项

时间:2013-11-30 15:31:16

标签: objective-c cocoa

我是Objective-C和Mac开发的初学者。我在这个网站上搜索了我正在寻找的答案,但是由于无知,我无法理解应该怎么做。

以下代码在Mac状态栏中实现了一个菜单,靠近屏幕右上角的电池,wifi等图标。

如果用户断开设备与计算机的连接,则使用一个布尔参数调用方法sayAdapterIsConnected。根据该参数,其中一个菜单项(在本例中为enabledOption)应该被禁用。我的意思是,应该启用或禁用菜单项。

仅当菜单关闭时才有效。如果statusMenu已打开,则不会更新。

我知道有一种更新开放式statusItem菜单的方法。菜单打开时,Wifi状态图标会更新其网络。

@interface ENHeringAppDelegate : NSObject <NSApplicationDelegate> {
    NSStatusItem * statusItem;
}

@property (weak) IBOutlet NSMenu *statusMenu;
@property (weak) IBOutlet NSMenuItem *enabledOption;

@end

@implementation ENHeringAppDelegate

- (void) awakeFromNib {
    statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
    [statusItem setMenu:_statusMenu];
    [statusItem setTitle:@"TEST"];
    [statusItem setHighlightMode:YES];
}

- (void)sayAdapterIsConnected:(bool)connected {
    if (connected)
        [self.enabledOption setEnabled:true];
    else
        [self.enabledOption setEnabled:false];
}

@end

1 个答案:

答案 0 :(得分:0)

这里不需要NSMenu。您也不需要setMenu:call。

这是一个有效的例子:

AppDelegate.h

#import <Cocoa/Cocoa.h>

@interface KBCAppDelegate : NSObject <NSApplicationDelegate> {
  NSStatusItem *statusItem;
}

@property (assign) IBOutlet NSWindow *window;

- (IBAction)update:(id)sender;

@end

AppDelegate.m

#import "AppDelegate.h"

@implementation KBCAppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
  // Insert code here to initialize your application

  statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
  [statusItem setTitle:@"TEST"];
  [statusItem setHighlightMode:YES];
  [statusItem setEnabled:YES];
  [statusItem setTarget:self];

}

- (IBAction)update:(id)sender {
  if (!statusItem.isEnabled) {
    [statusItem setEnabled:true];
  } else {
    [statusItem setEnabled:false];
  }
}

@end

这就是你需要做的一切。 (我使update:成为一个IBAction,但是像你所展示的那样的无效函数也会起作用)

P.S。 让我们兴高采烈,并且总是在if / then语句中使用大括号,即使只有一行。 :)