모든 메뉴 항목에 대한 IBOutlet
의 유지, 일반적으로,하지만 작동합니다 설명하는 방법은 지루한 될 수 있습니다. (솔루션이 작동하지 않는 경우 IBOutlet
이 nib 파일에 실제로 연결되어 있는지 확인하십시오. 및 적절한 시간에 제목을 설정해야합니다. 컨트롤러의 init
에서 설정하려는 경우 방법은, 예를 들면, 너무 일찍, 그리고 출구는 아직 연결되지 않은 : awakeFromNib
또는 유사한로 방법을 이동
는
장기적으로 더 좋은 방법은 비공식 <NSMenuDelegate>
프로토콜과 NSMenuValidation
를 (사용하는 것입니다.) 프로토콜을 사용하여 동적으로 (그리고 느리게) 메뉴 항목을 업데이트하십시오.
예를 들어, 다음과 같이 컨트롤러 클래스를 정의하십시오.
nib 파일에서
@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
16,는 statusItemMenu
delegate
의 출구는 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