[英]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文件中, statusItemMenu
的delegate
出口设置为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;
}
您无需连接菜单项,只需尝试此操作即可。
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.