2011-10-17 1 views
1

Apple에서 제공하는 사운드 컨트롤과 마찬가지로 세로 슬라이더가있는 상태 항목을 만들고 싶습니다. 내 질문은 : 어떻게 그것을 사운드 메뉴의 슬라이더처럼 위/아래 화살표 키에 반응하게합니까?NSStatusItem- 목표 -C/코코아에 대해 NSMenu에 화살표가있는 NSSlider

키를 눌렀을 때 값을 늘리거나 줄이는 NSSlider 하위 클래스를 만들려고했지만 (첫 번째 응답자로 설정해야 함) 첫 번째 응답자로 만들려면이 메뉴의 대표 클래스를 만들고이 메서드를 추가하십시오.

- (void)menuWillOpen: (NSMenu*)menu 
{ 
    if (menu == statusBarMenu) {   
     [THE_WINDOW_THAT_CONTAINS_THE_SLIDER makeFirstResponder: slider]; 
} 

어떤 창을 호출해야합니까? 다른 방법으로해야합니까? 어떻게 할거 니?

슬라이더 서브 클래스 :

#import <AppKit/AppKit.h> 

@interface KeyRespondingSlider : NSSlider 

@end 

@implementation KeyRespondingSlider 

- (BOOL)canBecomeKeyView 
{ 
    return YES; 
} 
- (BOOL)acceptsFirstResponder 
{ 
    return YES; 
} 

- (void)keyDown: (NSEvent*)theEvent 
{ 
    unsigned short keyCode = [theEvent keyCode]; 
    if (keyCode == 126) { // up-arrow 
     [self setDoubleValue: [self doubleValue] + kChange]; 
    } 
    else if (keyCode == 125) { // down-arrow 
     [self setDoubleValue: [self doubleValue] - kChange]; 
    } 
} 

@end 

나는 그것을 테스트 한 정상적인 NSWindow 표시와 함께 첫 번째로 반응입니다 때 작동합니다. 상태 표시 줄 항목의 메뉴로는 그 작업을 수행 할 수 없습니다.

답변

0

나는 그것을 알아 냈다. Apple은 메뉴 구현을 위해 NSCarbonMenuWindow이라는 NSWindow 하위 클래스를 사용합니다. 그래서 menuWillOpen : 메시지를받습니다. 메뉴를 열 때까지 조금 기다렸다가 마지막 창 (메뉴 창)을 만들고, 슬라이더를 firstResponder로 만듭니다. 그것은 모두 작동합니다!

- (void)menuWillOpen: (NSMenu*)menu 
{ 
    if (menu == statusBarMenu) { 
     [NSThread detachNewThreadSelector: @selector(threadedMenuWillOpen) toTarget: self withObject: nil]; 
    } 
} 

- (void)threadedMenuWillOpen 
{ 
    [NSThread sleepForTimeInterval: 0.1]; 

    NSArray* windows = [NSApp windows]; 
    NSWindow* menuWindow = [windows lastObject]; // The last window is the one I want because it has just been created 

    if ([[menuWindow className] isEqualToString: @"NSCarbonMenuWindow"]) { 
     [menuWindow makeFirstResponder: bSlider]; 
    }  
} 
0
- (void)keyDown: (NSEvent*)theEvent 
{ 
    unsigned short keyCode = [theEvent keyCode]; 
    if (keyCode == 126) { // up-arrow 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"upArrow" object:nil]; 
    } 
    else if (keyCode == 125) { // down-arrow 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"DownArrow" object:nil]; 
    } else 
    { 
     [super keyDown:theEvent]; 
    } 
} 
+0

추가 [슈퍼를 keyDown : theEvent] 또는 둘 이상이있는 경우 슬라이더 통해 탭 수 없습니다 –