标签: nsmenuitem

Apple如何在打开时更新机场菜单?(如何在NSMenu已经打开时更改)

我有一个弹出打开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)

这个方法肯定被调用,因为如果我单击菜单并立即返回到它,我会得到一个包含此信息的更新菜单.问题是它没有更新 - 而菜单是打开的.

cocoa objective-c statusbar nsmenu nsmenuitem

34
推荐指数
3
解决办法
4987
查看次数

如何访问系统选择的菜单项蓝色?

我的工作,有一个自定义的应用程序NSViewNSStatusBar,当用户点击它执行所有的绘图.但这就是问题,我正在绘制的颜色,因为视图的背景颜色与系统蓝色不同.

我的应用程序的颜色:
在此输入图像描述

Twitter的菜单项颜色(系统):
在此输入图像描述

你清楚地看到,我的蓝色比系统轻.这是我目前使用的代码(并且在比Yosemite更早的版本上完美运行):

[[NSColor selectedMenuItemColor] set];
NSRectFill(rect);
Run Code Online (Sandbox Code Playgroud)

我甚至尝试过挑选菜单项的颜色,但似乎颜色受到菜单栏下方壁纸的影响.
关于如何实现系统的任何想法看起来?

nsmenu nsmenuitem nscolor nsstatusbar osx-yosemite

29
推荐指数
1
解决办法
612
查看次数

禁用NSMenuItem

我以编程方式创建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)

cocoa nsmenuitem

20
推荐指数
1
解决办法
5246
查看次数

似乎无法在NSMenuItem上设置setEnabled:NO

我通过Interface Builder 进行了子类化NSMenu和连接NSMenuItem.我已经通过调试器测试了它们是否真的被初始化了.

菜单设置为不自动启用项目.仍然当我设置我的任何NSMenuItem时,[myMenuItem setEnabled:NO]它们仍然被启用.即使我[self update]从NSMenu子类内部调用.

我错过了什么?

cocoa nsmenu nsmenuitem

20
推荐指数
5
解决办法
8199
查看次数

NSMenuItem自定义视图上方的差距

我在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)

macos cocoa objective-c nsmenu nsmenuitem

19
推荐指数
1
解决办法
3817
查看次数

使用自定义视图突出显示NSMenuItem?

我创建了一个简单NSStatusBarNSMenu设置作为菜单.我还在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)

cocoa objective-c nsmenuitem

19
推荐指数
3
解决办法
5713
查看次数

显示主机菜单时更新NSMenuItem

我有一个NSMenuItem我需要更新以显示进度(如时间机器与它的备份).问题是,当我设置一个新title的,NSMenuItemtitle没有改变.

事实上,当我关闭并重新打开菜单时,它会发生变化,但我想在用户查看时更新它.

我也尝试删除一个项目并重新插入它没有结果.

有什么指针吗?

macos cocoa nsmenuitem

14
推荐指数
1
解决办法
1592
查看次数

用编程方式在NSMenuItems中创建NSMenu?

首先,我想指出这个问题可能已经被问过了,我找不到任何答案.

所以,我是以编程方式尝试创建一个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,但我该怎么做,如果那不是问题,那么它是什么?我对这些东西很陌生,但对学习感兴趣,所以任何提示都会比什么都好!

cocoa menu nsmenu nsmenuitem

14
推荐指数
1
解决办法
1万
查看次数

菜单项已启用,但仍显示为灰色

我有一个菜单,在界面构建器中创建了几个项目.它在那里看起来很好,并且检查了"启用".
但是当我运行应用程序时,所有菜单项都显示为灰色.

我已经检查过isEnabled,它返回true.

此外,以编程方式创建的菜单项(使用initWithTitle和不使用界面构建器)工作正常.

我在这里错过了什么吗?我对OSX开发真的很陌生(事实上,这是我的第一天).
谢谢

macos cocoa objective-c interface-builder nsmenuitem

13
推荐指数
2
解决办法
6046
查看次数

在基于文档的应用程序中连接菜单项

我已经就这个话题问了几个问题,并没有真正得到关于如何做到的真实答案(它实际上收到了"Tumbleweed Badge"大声笑).

我有一个基于文档的应用程序(意味着Menu.Xib与MyDocument.Xib分开).

假设我想添加一个'Bold'按钮或Check Spelling按钮(Menu.xib中列出的项目(在格式>字体等下)到MyDocument(主界面).我无法弄清楚如何执行此操作.

任何帮助将不胜感激(如果它有效,我将立即给予答案,这已经让我困扰了几个星期).

我尝试将字体管理器添加到MyDocument.Xib并以此方式连接,但Bold按钮仅启用,它不会禁用.另外,无法通过字体管理器激活拼写检查等.

必须有更好的方法来做到这一点.

Apple文档非常模糊.

cocoa objective-c nsmenuitem

13
推荐指数
1
解决办法
1789
查看次数