2013-01-17 6 views
5

임이 이미 요구되지 않았 음을 놀라게 (로그 아웃 로그인). 사용자가 로그인 할 때 메뉴 항목에서 로그 아웃을 말하고 싶습니다. 나는 NSMenuItem을 라벨이나 뭔가로 수정하는 콘센트를 만들려고 시도했다.NSMenuItem 제목을 변경하는 방법

[loginItem setTitle:@"Logout"];

AppDelegate.m

@property (retain) IBOutlet NSMenuItem *loginItem;

AppDelegate.h

그러나 didnt가 작동합니다.

제가 할 수 있었던 유일한 일은 이전 NSMenuItem을 삭제 한 다음 새 것을 추가하는 것이 었습니다. 다만 하단에 추가하는 것입니다. 이 작업을 수행하여 모든 메뉴 항목을 제거한 다음 다시 추가하는 유일한 방법은 무엇입니까 ?? 그것은 매우 비효율적 인 것처럼 보입니다. 당신은 그냥이 시도 메뉴 항목을 연결할 필요가 없습니다

+1

. 하지만 실제로'IBOutlet'을 메뉴 항목에 연결 했습니까? – trudyscousin

답변

4

모든 메뉴 항목에 대한 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,는 statusItemMenudelegate의 출구는 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 잘못이 일을하고 제안하는 귀하의 예제에서 거기에 아무것도

1

..

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. 
관련 문제