NSMenu 项目 greyed/disabled 原因不明
NSMenu items greyed/disabled for not apparent reason
我有以下启动 "tray icon" 并向其添加 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
出于某种原因,我的菜单看起来像这样。
为什么会启用 Quit 而 "Start Server" 和 "End Server" 不会?通过在 Start/Stop 服务器上使用 @selector(terminate:) 它们被启用。也许我的方法 startServer 和 stopServer 语法错误?
我们有类似的代码,我删除了 -setTarget
调用并看到禁用状态。
正如 Willeke 所说,这是因为您的对象不在响应者链中。
因此,只需确保明确设置 target
属性:
NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:@"Start" action:@selector(startServer:) keyEquivalent:@""];
[item setTarget:self];
[menu addItem:item];
目标应该设置很明显,但最重要的是目标参考应该很强。
我有以下启动 "tray icon" 并向其添加 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
出于某种原因,我的菜单看起来像这样。
为什么会启用 Quit 而 "Start Server" 和 "End Server" 不会?通过在 Start/Stop 服务器上使用 @selector(terminate:) 它们被启用。也许我的方法 startServer 和 stopServer 语法错误?
我们有类似的代码,我删除了 -setTarget
调用并看到禁用状态。
正如 Willeke 所说,这是因为您的对象不在响应者链中。
因此,只需确保明确设置 target
属性:
NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:@"Start" action:@selector(startServer:) keyEquivalent:@""];
[item setTarget:self];
[menu addItem:item];
目标应该设置很明显,但最重要的是目标参考应该很强。