你描述應該工作,但是,在一般情況下,保持IBOutlet
獻給所有的菜單項的方法可能很乏味。 (如果您的解決方案無法正常工作,請確保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
在筆尖文件時,delegate
出口statusItemMenu
的被設置爲MDAppDelegate
控制器類。這確保MDAppDelegate
類在響應者鏈中,並允許它與validating the menu items一起使用。
然後,你可以實現你的.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
有沒有在你的例子,建議你沒有正確地這樣做。但是,你真的把你的IBOutlet連接到菜單項嗎? – trudyscousin