あなたが説明した方法は機能するはずですが、一般に、IBOutlet
すべてのメニュー項目の s を保持するのは面倒な場合があります。(ソリューションが機能しない場合は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 ファイルでは、のdelegate
アウトレットがコントローラ クラスstatusItemMenu
に設定されています。これにより、クラスがレスポンダー チェーン内にある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