我基于数组动态构建菜单,并且有一个子菜单链接到IBAction,它在Finder中打开一个文件夹.它打开的文件夹基于我的初始数组中对象的属性.
有没有办法将NSMenuItem操作链接到IBAction并传入此目录变量,因为我正在动态创建此数组?
或者我应该进入IBAction并通过引用NSMenuItem与数组来解析目录?
例如
person = [[Person alloc] init];
// person is assigned
subMenu = [[NSMenu alloc] init];
[subMenu addItemWithTitle:@"Open folder" action:@selector(openDirectory:person.directory) keyEquivalent:@""];
Run Code Online (Sandbox Code Playgroud) 我很惊讶,这还没有被问到:
但是如何改变菜单中的NSMenuItem标题呢NSStatusBar?当用户登录时,我希望菜单项说出注销.我试过创建一个插座来修改我NSMenuItem的标签或其他东西.
AppDelegate.h
@property (retain) IBOutlet NSMenuItem *loginItem;
AppDelegate.m
[loginItem setTitle:@"Logout"];
但那没有用.
我唯一能做的就是删除旧的NSMenuItem,然后添加一个新的,但它只是将它添加到底部.是唯一的方法来删除每个菜单项然后重新添加它们?这似乎非常低效.
这是事情:
我已经创建了一个NSMenuItem带有自定义的自定义NSView.
一切正常,只是我不能让罚款NSMenuItem得到强调(=更改鼠标悬停背景颜色).
我正在尝试在drawRect方法内部进行,如此处发布的其他答案所示.
我究竟做错了什么?
该NSView子类:
@interface customView : NSView
@end
@implementation customView
- (id)initWithFrame:(NSRect)frame
{
NSRect theRect = NSMakeRect(0, 0, 200, 30);
self = [super initWithFrame:theRect];
if (self) {
NSTrackingArea * trackingArea = [[NSTrackingArea alloc] initWithRect:theRect
options: (NSTrackingMouseEnteredAndExited | NSTrackingActiveInKeyWindow |NSTrackingActiveAlways)
owner:self userInfo:nil];
[self addTrackingArea:trackingArea];
}
return self;
}
#define menuItem ([self enclosingMenuItem])
- (void) drawRect: (NSRect) rect {
BOOL isHighlighted = [menuItem isHighlighted];
if (isHighlighted) {
//this nslog …Run Code Online (Sandbox Code Playgroud) 如何更改NSMenuItem的高度?当我更改菜单的字体时,NSMenuItem会自动调整大小以适合标题,在标题的上方或下方不留空格.它看起来非常狭窄.
看起来像这样:

希望它看起来像这样:

我已经尝试了与菜单项的属性标题相关的百万次调整,但无济于事.我也不想使用菜单项的view属性,因为我想保持高亮显示.还有其他想法吗?
编辑:这是我想要的(或多或少),但基于NSMenu,而不是从头开始重做.

我正在编写一个NSMenuItem我想让它访问的自定义视图。当我不覆盖时accessibilityIsIgnored(因此返回NSView默认值YES),我在 Accessibility Inspector 中看到AXMenuItem使用自定义视图的菜单项的可访问性层次结构中有一个基本对象,但它缺少菜单项的大部分必需属性例如“标题”:

所需的属性是对于不使用自定义视图菜单项设置。
当我覆盖accessibilityIsIgnoredreturn 时NO,这会导致一个额外的辅助功能对象被添加到层次结构中(默认情况下是一个AXUnknown对象):

由 的覆盖返回的属性值accessibilityAttributeValue:应用于AXUnknown下的此对象AXMenuItem,而不是应用于AXMenuItem对象本身的所需效果。
如何为菜单项提供缺失的属性值?
当App Store有更新时,它会在菜单项中显示内联样式元素,如下面屏幕截图中的"1 new":

另一个我们可以看到这种菜单的地方是10.10 Yosemite的分享菜单.当您安装添加新共享扩展程序的任何应用时,共享菜单中的"更多"项目将显示"N new",就像应用商店菜单一样.
'App Store ...'项看起来很正常NSMenuItem.是否有一种简单的方法来实现它,或者是否有任何支持它的API而没有为菜单项设置自定义视图?
所以这是我的情况,我有一个小应用程序可以跟踪你工作了多长时间,并让你知道什么时候休息。我有一个 NSTimer 每秒触发一次并更新一些数字(剩余时间)。该应用程序位于状态栏中,我希望剩余时间显示在状态菜单下拉菜单中的菜单项中。现在我将它更新到 NSMenuItem 并且它可以工作,但是当您单击菜单栏中的图标以获取菜单时,当您查看它时,时间不会动态更新。如果您更改焦点然后返回菜单,则时间保持正确,但同样,当菜单打开时,它不会更新。
无论如何,即使菜单快速打开,我也可以让 MenuItem 更新吗?还有其他几个具有客观 C 解决方案的线程,但我无法快速调整它们。
如何突出一个特定的NSMenuItem?现在只是在方法highlightedItem上NSMenu,但没有setHighlightedItem
我想在其中创建一个NSMenuItem包含多行文本,并且我还想在两行文本旁边显示一个图标.我不能使用自定义视图,因为它不会正确突出显示,我不能只在菜单项的标题中添加换行符,因为换行符变成了空格.我该怎么办?
我有一个带有NSButton作为其视图的NSToolbarItem和一个位于主菜单中的NSMenuItem。两者具有相同的动作,该动作被发送到第一响应者,而不是特定的目标。该方法最终在窗口内容视图的视图层次结构中的NSSplitViewController的子类中实现。我想验证两个项目,但是让特定的拆分视图控制器负责验证,因为它依赖于该控制器本地的某些条件。
我推翻validateToolbarItem(_:)并validateMenuItem(_:)在该分割视图控制器。对于菜单项,它按预期工作。调用该方法,然后进行验证。validateToolbarItem(_:)但是,永远不会被调用。
根据Apple的文档,NSToolbar不会发送validateToolbarItem(_:)到基于视图的工具栏项目。为了对此进行测试,我将工具栏项目替换为图像工具栏项目,并且该工具栏按预期工作。
基于此,我遇到了几种解决方案,但是它们并不是我想要的。
子类NSToolbarItem并重写validate()。但是,没有给出有关最终如何validateToolbarItem(_:)调用控制器的指导。
子类化NSToolbar并重写validateVisibleToolbarItems(),然后将消息发送给第一响应者。在这里,我遇到了一个问题,即我无法向拆分视图控制器发送消息,因为它不在工具栏的响应者链之外。
如上所述,子类NSToolbar,但是validateToolbarItem(_:)在响应者链中的控制器(例如NSWindowController)中实现。这将起作用,但随后我必须添加其他代码来处理菜单项不必要的内容。
是否有一个优雅的解决方案可以像在图像工具栏项和菜单项上一样好用?
nsmenuitem ×10
cocoa ×9
objective-c ×6
macos ×5
nsmenu ×4
nsresponder ×1
nstimer ×1
nstoolbar ×1
nsview ×1
swift ×1