我有一个弹出打开NSMenu的状态栏项目,我有一个委托集,它正确连接(-(void)menuNeedsUpdate:(NSMenu *)menu
工作正常).也就是说,该方法设置为在显示菜单之前调用,我需要监听并触发异步请求,稍后在菜单打开时更新菜单,我无法弄清楚应该如何完成.
谢谢 :)
编辑
好的,我现在在这里:
单击菜单项(在状态栏中)时,将调用一个运行NSTask的选择器.我使用通知中心来监听该任务何时完成,并写下:
[[NSRunLoop currentRunLoop] performSelector:@selector(updateTheMenu:) target:self argument:statusBarMenu order:0 modes:[NSArray arrayWithObject:NSEventTrackingRunLoopMode]];
Run Code Online (Sandbox Code Playgroud)
并有:
- (void)updateTheMenu:(NSMenu*)menu {
NSMenuItem *mitm = [[NSMenuItem alloc] init];
[mitm setEnabled:NO];
[mitm setTitle:@"Bananas"];
[mitm setIndentationLevel:2];
[menu insertItem:mitm atIndex:2];
[mitm release];
}
Run Code Online (Sandbox Code Playgroud)
这个方法肯定被调用,因为如果我单击菜单并立即返回到它,我会得到一个包含此信息的更新菜单.问题是它没有更新 - 而菜单是打开的.
我的工作,有一个自定义的应用程序NSView
上NSStatusBar
,当用户点击它执行所有的绘图.但这就是问题,我正在绘制的颜色,因为视图的背景颜色与系统蓝色不同.
我的应用程序的颜色:
Twitter的菜单项颜色(系统):
你清楚地看到,我的蓝色比系统轻.这是我目前使用的代码(并且在比Yosemite更早的版本上完美运行):
[[NSColor selectedMenuItemColor] set];
NSRectFill(rect);
Run Code Online (Sandbox Code Playgroud)
我甚至尝试过挑选菜单项的颜色,但似乎颜色受到菜单栏下方壁纸的影响.
关于如何实现系统的任何想法看起来?
我以编程方式创建NSMenuItem并禁用它.如果我覆盖validateMenuItem:方法并为所有项返回YES,则菜单项工作正常.
当我告诉菜单autoEnableItems并且不重写validateMenuItem:方法时,为什么不启用它?
NSMenuItem *menuItem = [[NSMenuItem alloc] initWithTitle:label action:@selector(methodToLogSomething:) keyEquivalent:@""];
menuItem.representedObject = representedObject;
[menuItem setTarget:self];
[menu insertItem:menuItem atIndex:[[menu itemArray] count]-1];
[menuItem release];
[menu setAutoenablesItems:YES];
Run Code Online (Sandbox Code Playgroud) 我通过Interface Builder 进行了子类化NSMenu
和连接NSMenuItem
.我已经通过调试器测试了它们是否真的被初始化了.
菜单设置为不自动启用项目.仍然当我设置我的任何NSMenuItem时,[myMenuItem setEnabled:NO]
它们仍然被启用.即使我[self update]
从NSMenu子类内部调用.
我错过了什么?
我在a上使用setView:
方法NSMenuItem
来设置自定义视图.在此自定义视图中,有一个图像占据整个视图.在NSMenuItem
这个自定义视图是在菜单的第一个,但问题是,它不坐与菜单的顶部齐平,有很大的差距,你可以在这里看到:
为什么会这样,我怎么能阻止它呢?
编辑
我现在正在使用此代码,但我正在EXC_BAD_ACCESS
上线InstallControlEventHandler
.
-(void)applicationDidFinishLaunching:(NSNotification *)aNotification {
HIViewRef contentView;
MenuRef menuRef = [statusMenu carbonMenuRef];
HIMenuGetContentView(menuRef, kThemeMenuTypePullDown, &contentView);
EventTypeSpec hsEventSpec[1] = {
{ kEventClassMenu, kEventMenuCreateFrameView }
};
InstallControlEventHandler(contentView,
NewEventHandlerUPP((EventHandlerProcPtr)hsMenuCreationEventHandler),
GetEventTypeCount(hsEventSpec),
hsEventSpec,
NULL,
NULL); // Get EXC_BAD_ACCESS here.
}
static OSStatus hsMenuContentEventHandler( EventHandlerCallRef caller, EventRef event, void* refcon )
{
OSStatus err;
check( GetEventClass( event ) == kEventClassControl );
check( GetEventKind( event ) == kEventControlGetFrameMetrics );
err = CallNextEventHandler( caller, event ); …
Run Code Online (Sandbox Code Playgroud) 我创建了一个简单NSStatusBar
的NSMenu
设置作为菜单.我还在NSMenuItems
这个菜单中添加了一些,它工作得很好(包括选择器和突出显示),但是一旦我添加自定义视图(setView :),就不会突出显示.
CustomMenuItem *menuItem = [[CustomMenuItem alloc] initWithTitle:@"" action:@selector(openPreferences:) keyEquivalent:@""];
[menuItem foo];
[menuItem setTarget:self];
[statusMenu insertItem:menuItem atIndex:0];
[menuItem release];
Run Code Online (Sandbox Code Playgroud)
我的foo方法是:
- (void)foo {
NSView *view = [[NSView alloc] initWithFrame:CGRectMake(5, 10, 100, 20)];
[self setView:view];
}
Run Code Online (Sandbox Code Playgroud)
如果我删除了setView方法,它将突出显示.
我搜索并搜索过,找不到实现/启用此方法的方法.
编辑
我在NSView SubClass中按照此问题中的代码实现了突出显示:
NSMenuItem的视图(NSView子类的实例)在悬停时不突出显示
#define menuItem ([self enclosingMenuItem])
- (void) drawRect: (NSRect) rect {
BOOL isHighlighted = [menuItem isHighlighted];
if (isHighlighted) {
[[NSColor selectedMenuItemColor] set];
[NSBezierPath fillRect:rect];
} else {
[super drawRect: rect];
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个NSMenuItem
我需要更新以显示进度(如时间机器与它的备份).问题是,当我设置一个新title
的,NSMenuItem
并title
没有改变.
事实上,当我关闭并重新打开菜单时,它会发生变化,但我想在用户查看时更新它.
我也尝试删除一个项目并重新插入它没有结果.
有什么指针吗?
首先,我想指出这个问题可能已经被问过了,我找不到任何答案.
所以,我是以编程方式尝试创建一个NSMenu和NSMenuItem到主栏,所以fe.NSMenu将是File,然后它将包含3x NSMenuItem,New,Open和Save.
但是没有什么工作,这就是我目前所拥有的:
NSMenu *fileMenu = [[NSMenu alloc] initWithTitle:@"File"];
NSMenuItem *newMenu = [[NSMenuItem alloc] initWithTitle:@"New" action:NULL keyEquivalent:@""];
NSMenuItem *openMenu = [[NSMenuItem alloc] initWithTitle:@"Open" action:NULL keyEquivalent:@""];
NSMenuItem *saveMenu = [[NSMenuItem alloc] initWithTitle:@"Save" action:NULL keyEquivalent:@""];
[newMenu setMenu:fileMenu];
[openMenu setMenu:fileMenu];
[saveMenu setMenu:fileMenu];
Run Code Online (Sandbox Code Playgroud)
但没有任何反应,我很确定我必须告诉应用程序它应该使用fileMenu,但我该怎么做,如果那不是问题,那么它是什么?我对这些东西很陌生,但对学习感兴趣,所以任何提示都会比什么都好!
我有一个菜单,在界面构建器中创建了几个项目.它在那里看起来很好,并且检查了"启用".
但是当我运行应用程序时,所有菜单项都显示为灰色.
我已经检查过isEnabled
,它返回true.
此外,以编程方式创建的菜单项(使用initWithTitle
和不使用界面构建器)工作正常.
我在这里错过了什么吗?我对OSX开发真的很陌生(事实上,这是我的第一天).
谢谢
我已经就这个话题问了几个问题,并没有真正得到关于如何做到的真实答案(它实际上收到了"Tumbleweed Badge"大声笑).
我有一个基于文档的应用程序(意味着Menu.Xib与MyDocument.Xib分开).
假设我想添加一个'Bold'按钮或Check Spelling按钮(Menu.xib中列出的项目(在格式>字体等下)到MyDocument(主界面).我无法弄清楚如何执行此操作.
任何帮助将不胜感激(如果它有效,我将立即给予答案,这已经让我困扰了几个星期).
我尝试将字体管理器添加到MyDocument.Xib并以此方式连接,但Bold按钮仅启用,它不会禁用.另外,无法通过字体管理器激活拼写检查等.
必须有更好的方法来做到这一点.
Apple文档非常模糊.
nsmenuitem ×10
cocoa ×9
nsmenu ×5
objective-c ×5
macos ×3
menu ×1
nscolor ×1
nsstatusbar ×1
osx-yosemite ×1
statusbar ×1