【问题标题】:How to update a menu item in a status menu on Objective-C如何更新 Objective-C 状态菜单中的菜单项
【发布时间】:2013-11-30 15:31:15
【问题描述】:

我是 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

【问题讨论】:

  • 你说你“已经尝试了这个论坛的许多解决方案,但没有一个对我有用。”请说明您尝试了哪些解决方案以及结果如何,这样我们就不再重复了。

标签: objective-c cocoa


【解决方案1】:

这里不需要 NSMenu。你也不需要 setMenu: 调用。

这是一个工作示例:

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,但像您展示的那样的 void 函数也可以)

附: 让我们挑剔的人感到高兴,并且总是在你的 if/then 语句中使用大括号,即使只有一行。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多