2012-05-04 2 views
2

NSButton을 서브 클래 싱하는 것은 마우스를 누르고있는 동안 선택자를 반복해야하기 때문입니다.NSButton을 서브 클래 싱하여 일반 버튼처럼 보이게해야합니다.

I는 다음과 같이 그 일을 해요 :

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code here. 
     [self setBezelStyle:NSBezelBorder]; 
     PotRightIsDown = NO; 
    } 

    return self; 
} 

- (void)drawRect:(NSRect)dirtyRect 
{ 
    // Drawing code here. 
} 

- (void)mouseDown:(NSEvent *)theEvent; 
{  
    NSLog(@"pot right mouse down"); 
    PotRightIsDown = YES; 
    holdDownTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(sendCommand) userInfo:nil repeats:YES]; 
} 

- (void)mouseUp:(NSEvent *)theEvent; 
{ 
    NSLog(@"pot right mouse up"); 
    PotRightIsDown = NO; 
} 

-(void)sendCommand 
{ 
    if (PotRightIsDown) 
    { 
     NSLog(@"run the stuff here"); 
    } 
    else 
    { 
     [holdDownTimer invalidate]; 
    } 
} 

작품을 챔피언과 같은 명령을 100ms마다 보냅니다.

IB의 창에서 베벨 버튼을 창으로 드래그하고이 서브 클래스에 클래스를 설정했습니다. 응용 프로그램을 실행하면 단추가 보이지 않지만 작동합니다. 하위 클래스에 빈 drawRect 함수가 있기 때문에 이것이라고 생각합니다.

이 서브 클래 싱 된 버튼을 베벨 버튼처럼 보이게하려면 어떻게해야합니까? 당신은 당신이 단순히 슈퍼 클래스 기본 동작을 제공 할 수있는, 모두를 구현 피할 수 있습니다 특정 서브 클래스 방법에 어떤 기능을 추가하지 않는 경우


상태 저장

+1

'[super drawRect : dirtyRect]'? –

+0

Carl is right'-drawRect' 메서드로 작성해야합니다. 하지만 당신이'-mouseDown'과'-mouseUp'을 사용하는 것을 보았습니다. 왼쪽 버튼을 누르지 않았을 때 호출되었습니다. 원한다면'-rightMouseDown'과'-rightMouseUp'을 사용해야합니다. –

+0

그게 쉬웠습니다. 팁 주셔서 감사합니다, 칼. 답변을 추가하여 확인 표시하겠습니다. 저스틴, 왼쪽 마우스를 누르십시오. 나는 PotRight라고 부르기 만하면됩니다. 명령을 내려 놓으면 컨트롤러에 시리얼 포트를 통해 명령을 보내면 제어중인 컨트롤러의 전위차계가 시계 방향으로 회전하는 것으로 해석됩니다. – Stateful

답변

3

을 주셔서 감사합니다.

- (void)drawRect:(NSRect)dirtyRect 
{ 
    [super drawRect:dirtyRect]; 
} 

을하지만 조금 무의미 : (내 @Carl Norum을 지적)

은 또한 명시 적으로 사용하는 것을 할 수 있습니다.

관련 문제