NSMenu项目灰色/禁用不明显的原因

时间:2015-10-22 22:55:09

标签: objective-c cocoa foundation

我有以下代码启动“托盘图标”并向其添加NSMenu。

#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>

@interface TrayIcon : NSObject

@property(strong) NSStatusItem *statusItem;

- (void)makeTrayIcon;


- (void)stopServer:(nullable id)sender;

- (void)startServer:(nullable id)sender;

@end

和...

#import "TrayIcon.h"


@implementation TrayIcon {

}
- (void)makeTrayIcon {

    // Flycut/AppController.h
    IBOutlet NSMenu *jcMenu;

    // Flycut/AppController.m
    _statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
    [_statusItem setHighlightMode:YES];

    [_statusItem setImage:[NSImage imageNamed:@"16.png"]];

    [_statusItem setMenu:jcMenu];
    [_statusItem setEnabled:YES];

    //Add Menu
    {
        NSMenu *menu = [[NSMenu alloc] init];
        [menu addItemWithTitle:@"Start Server" action:@selector(startServer:) keyEquivalent:@""];
        [menu addItemWithTitle:@"Stop Server" action:@selector(stopServer:) keyEquivalent:@""];
        [menu addItem:[NSMenuItem separatorItem]];
        [menu addItemWithTitle:@"Quit" action:@selector(terminate:) keyEquivalent:@""];
        _statusItem.menu = menu;
    }

}

- (void)stopServer:(nullable id)sender {
    NSLog(@"Stop STUFF");
}

- (void)startServer:(nullable id)sender {
    NSLog(@"Start STUFF");
}

@end

出于某种原因,我的菜单看起来像这样。

enter image description here

为什么要启用Quit但是“Start Server”和“End Server”不是?通过在启动/停止服务器上使用@selector(terminate :),它们将被启用。也许我的方法startServer和stopServer中的语法错误了?

2 个答案:

答案 0 :(得分:3)

我们有类似的代码,我删除了-setTarget调用并看到了禁用状态。

正如Willeke所说,这是因为你的对象不在响应者链中。

因此,请确保明确设置target属性:

  NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:@"Start" action:@selector(startServer:) keyEquivalent:@""];
  [item setTarget:self];
  [menu addItem:item];

答案 1 :(得分:0)

目标应该设置得很明显,但是最重要的是目标参考应该强大