我很惊讶,这还没有被问到:
但是如何更改NSMenuItem
菜单中的NSStatusBar
标题呢?当用户登录时,我希望菜单项说出注销。我尝试创建一个插座来修改我的NSMenuItem
作为标签或其他东西。
AppDelegate.h
@property (retain) IBOutlet NSMenuItem *loginItem;
AppDelegate.m
[loginItem setTitle:@"Logout"];
但那没用。
我唯一能做的就是删除旧的NSMenuItem
,然后添加一个新的,但它只是将它添加到底部。是唯一的方法来删除每个菜单项然后重新添加它们?这似乎非常低效。
答案 0 :(得分:4)
您描述的方法应该可行,但一般来说,为所有菜单项保留IBOutlet
可能会很乏味。 (如果您的解决方案不起作用,请确保在{n>文件中实际连接IBOutlet
,和确保您在适当的时间设置了标题。如果您'重新尝试在控制器的init
方法中设置它,例如,太早了,并且插座尚未连接:将方法移至awakeFromNib
或类似方法。
从长远来看,更好的方法是使用<NSMenuDelegate>
协议和NSMenuValidation
(非正式)协议动态(和懒惰)更新菜单项。
例如,定义您的控制器类,如下所示:
@interface MDAppDelegate : NSObject <NSApplicationDelegate, NSMenuDelegate>
@property (strong) NSStatusItem *statusItem;
@property (weak) IBOutlet NSWindow *window;
@property (weak) IBOutlet NSMenu *statusItemMenu;
@property (weak) IBOutlet NSMenuItem *toggleLoginLogoutMenuItem;
@property (weak) IBOutlet NSTextField *statusField;
@property (weak) IBOutlet NSTextField *progressField;
@property (weak) IBOutlet NSProgressIndicator *progressIndicator;
@property (assign) BOOL loggedIn;
- (IBAction)toggleLoginLogout:(id)sender;
@end
在nib文件中,delegate
的{{1}}出口设置为statusItemMenu
控制器类。这可以确保MDAppDelegate
类位于响应者链中,并允许它与validating the menu items一起使用。
然后你可以实现你的.m,如下所示:
MDAppDelegate
答案 1 :(得分:1)
您只需尝试此操作就无需连接菜单项。
NSMenuItem *menuItem = (NSMenuItem*) sender;
NSString *menuString = menuItem.title;
if ([menuString isEqualToString:@"Login"])
{
[menuItem setTitle:@"LogOut"];
}
NSMenuItem menuItem =(NSMenuItem )发件人;
this line automatically collect the menu items in your app.