繁体   English   中英

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

[英]How to change NSMenuItem Title (Login to Logout)

我很惊讶尚未被问到:

但是如何改变NSStatusBar菜单中的NSMenuItem标题。 当用户登录时,我希望菜单项说注销。 我试图创建一个插座来修改我的NSMenuItem就像标签或其他东西一样。

AppDelegate.h

@property (retain) IBOutlet NSMenuItem *loginItem;

AppDelegate.m

[loginItem setTitle:@"Logout"];

但这没有用。

我唯一能做的就是删除旧的NSMenuItem ,然后添加一个新的NSMenuItem ,但这只会将其添加到底部。 是这样做的唯一方法是删除每个菜单项然后重新添加它们吗? 看来效率很低。

尽管通常来说,为所有菜单项保留IBOutlet可能很乏味,但是您描述的方法应该可以工作。 (如果您的解决方案无法正常工作,请确保IBOutlet实际上已连接到nib文件中, 确保您在适当的时候设置了标题。如果要尝试在控制器的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文件中, statusItemMenudelegate出口设置为MDAppDelegate控制器类。 这样可以确保MDAppDelegate类位于响应者链中,并允许其与验证菜单项一起使用

然后,您可以像下面这样实现您的.m:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    _statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
    _statusItem.menu = _statusItemMenu;
    _statusItem.title = NSLocalizedString(@"NSStatusItem", @"");
    [self updateLoggedInStatus];
}
- (void)updateLoggedInStatus {
    [self.statusField setStringValue:(self.loggedIn ? @"Logged in" : @"Logged out")];
}
- (IBAction)toggleLoginLogout:(id)sender {
    [self performSelector:@selector(finishFakeLoginLogout:)
                         withObject:nil afterDelay:2.0];
}
- (void)finishFakeLoginLogout:(id)sender {
    self.loggedIn = !self.loggedIn;
    [self updateLoggedInStatus];
}
- (void)menuNeedsUpdate:(NSMenu *)menu {
#if MD_DEBUG
    NSLog(@"[%@ %@]", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
#endif
}
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
#if MD_DEBUG
    NSLog(@"[%@ %@]", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
#endif
    SEL action = menuItem.action;
    if (action == @selector(toggleLoginLogout:)) {
        [menuItem setTitle:(self.loggedIn ? @"Logout" :@"Login")];
    }
    return YES;
}

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

您无需连接菜单项,只需尝试此操作即可。

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. 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM