如何更改NSMenuItem标题(登录注销)

时间:2013-01-17 03:56:43

标签: objective-c cocoa nsmenuitem

我很惊讶,这还没有被问到:

但是如何更改NSMenuItem菜单中的NSStatusBar标题呢?当用户登录时,我希望菜单项说出注销。我尝试创建一个插座来修改我的NSMenuItem作为标签或其他东西。

AppDelegate.h

@property (retain) IBOutlet NSMenuItem *loginItem;

AppDelegate.m

[loginItem setTitle:@"Logout"];

但那没用。

我唯一能做的就是删除旧的NSMenuItem,然后添加一个新的,但它只是将它添加到底部。是唯一的方法来删除每个菜单项然后重新添加它们?这似乎非常低效。

2 个答案:

答案 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

示例项目:http://github.com/NSGod/NSStatusBarFinagler

答案 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.