2012-10-28 4 views
0

나는 Block 클래스, Row 클래스 및 Table 클래스의 세 가지 하위 클래스가 있습니다. 모두 NSView의 서브 클래스입니다.
프로그래밍 방식으로 8 개의 행을 표시하는 IB가있는 표가 있으며 각 표에는 8 개의 블록이 표시됩니다. 블록에서 mouseDown : 메서드를 오버라이드하여 배경색을 빨간색으로 변경했지만 작동하지 않습니다. 여전히 IB가있는 테이블 위에 직접 블록을 추가하면 첫 번째 경우에 작동하지 않는 이유를 이해할 수 없습니다.프로그래밍 방식으로 추가 된 테이블 뷰의 하위 뷰가 마우스 다운 이벤트에 응답하지 않습니다.

//block.m 

- (void)drawRect:(NSRect)dirtyRect 
{ 
    [color set]; 
    [NSBezierPath fillRect:dirtyRect]; 
} 

-(void)mouseDown:(NSEvent *)theEvent 
{ 
    color = [NSColor redColor]; 
    checked = YES; 
    [self setNeedsDisplay:YES]; 
} 

//row.m 

- (void)drawRect:(NSRect)dirtyRect 
{ 

    [[NSColor blueColor] set]; 
    [NSBezierPath fillRect:dirtyRect]; 
    int x; 
    for(x=0; x<8; x++){ 
    int margin = x*2; 
    NSRect rect = NSMakeRect(0, 50*x+margin, 50, 50); 
    Block *block = [[Block alloc] initWithFrame:rect]; 
    [self addSubview:block]; 
    } 
} 

답변

0

나는 mouseDown 구현으로 인해 블록을 다시 그리기 때문에 슈퍼 뷰조차도 테이블의 drawRect : 메서드를 호출하여 이전 블록 위에 새로운 블록을 그리는 등의 문제를 이해했습니다. 결코 색깔을 바꾸지 않는 것처럼 보일 것입니다. 그래서 isFirstAppearance라는 테이블에 대한 속성을 처음에 YES로 설정했습니다. YES로 설정하면 테이블에 행이 그려지고 NO로 설정됩니다.

0

당신에게 있습니까 NSTableView는이는 NSView의 드로잉 및 아니에요에 대한 NSCell에 객체를 사용하는 것을 알고 :

다음 블록 및 행 (테이블의 구현은 행의와 같은 방식으로 작동합니다)에 대한 구현 코드는? 그렇지 않다면, NSCell을 조사하십시오 - NSTable에서 커스텀 드로잉을 위해 그것을 사용하는 것은 갈 방법입니다.

+1

이것은 대답보다 많은 댓글로 보입니다. – mnel

+0

나는 NSTableView를 사용하지 않기 때문에 시도 할 것입니다. 왜 그것이 작동하지 않는지 이해하고 싶었습니다. – BigCola