2012-04-17 2 views
5

뷰 기반의 단일 열 NSTableView가 있습니다. 내 NSTableCellView 하위 클래스에는 선택할 수 있지만 편집 할 수없는 NSTextView가 있습니다.NSTableCellView에서 NSTextView를 클릭 할 때 NSTableView에서 행을 선택하는 방법은 무엇입니까?

사용자가 NSTableCellView를 직접 클릭하면 행이 제대로 강조 표시됩니다. 그러나 사용자가 해당 NSTableCellView 안의 NSTextView를 클릭하면 행이 강조 표시되지 않습니다.

행이 강조 표시되도록 NSTableCellView로 전달할 NSTextView를 클릭하면 어떻게됩니까?

클래스 계층 구조를 보이는 같은 : NSScrollView> NSTableView는> NSTableColumn> NSTableCellView>를 NSTextView

+0

나는 당신이보고있는 무엇을 복제 할 수 없습니다. 보기 기반 셀에 텍스트 필드를 추가 할 때 해당 필드를 클릭하면 텍스트 필드가 아닌 행이 선택됩니다 (다시 클릭해야 해당 필드가 나타납니다). 그것이 무엇인가에 묶여 있습니까? 아니면 데이터 소스를 사용하고 있습니까? – rdelmar

+0

NSTextField가 아니라 NSTextView를 사용하고 있습니다. 예, 텍스트 필드와 동일한 동작을하지만 응용 프로그램에 textview가 필요합니다. – sam

답변

6

여기 내가 뭘 결국거야. 나는를 NSTextView의 서브 클래스를 만들어 mouseDown를 오버라이드 다음과 같이 ...

- (void)mouseDown:(NSEvent *)theEvent 
{ 
    // Notify delegate that this text view was clicked and then 
    // handled the click natively as well. 
    [[self myTextViewDelegate] didClickMyTextView:self]; 
    [super mouseDown:theEvent]; 
} 

내가를 NSTextView의 표준 대리자를 ... 재사용하고있어

- (id<MyTextViewDelegate>)myTextViewDelegate 
{ 
    // See the following for info on formal protocols: 
    // stackoverflow.com/questions/4635845/how-to-add-a-method-to-an-existing-protocol-in-cocoa 
    if ([self.delegate conformsToProtocol:@protocol(MyTextViewDelegate)]) { 
     return (id<MyTextViewDelegate>)self.delegate; 
    } 
    return nil; 
} 

그리고 헤더에

...

@protocol MyTextViewDelegate <NSTextViewDelegate> 
- (void)didClickMyTextView:(id)sender; 
@end 

델리게이트에서 didClickMyTextView :를 구현하여 행을 선택합니다.

- (void)didClickMyTextView:(id)sender 
{ 
    // User clicked a text view. Select its underlying row. 
    [self.tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:[self.tableView rowForView:sender]] byExtendingSelection:NO]; 
} 
+0

깔끔한 - 단일 이벤트에서 두 개의 충돌하지 않는 작업. 많은 경우에 적용 할 수있는 디자인 패턴을 만들었습니다. – Wienke

+0

모든 문제에 대한 하나의 답변, 훌륭한 해결책. – mohacs

0

난 당신이 내가 여기에 있었다 본질적으로 같은 문제가 있다고 생각 : pass event on합니다. 허용되는 답변을 참조하십시오. 같은 패턴에 따라

, 당신이를 NSTextView를 서브 클래스 내가 가정있어 수퍼에에 이벤트를 전달하는 - (void)mouseUp:(NSEvent *)theEvent를 오버라이드 (override) 할 것있는 tableView입니다 :

- (void)mouseUp:(NSEvent *)theEvent { 
    [superView mouseUp:theEvent]; 
} 
+1

행운이 없습니다. MouseUp :을 재정의하고 이벤트를 superView로 보내는 것은 아무 것도하지 않는 것 같습니다. 그런 다음 mouseDown을 무시하고 이벤트를 superView로 보냈습니다. 그 행을 선택하지만 텍스트 (기본적으로 textview의 마우스 기능)를 선택하는 능력을 잃게됩니다. 나는 내 대답에 묘사 된대로이 문제를 해결했으며 당신이 염두에 두었던 것과 너무 다르지 않다. – sam

1

또는는 NSTextField있는을 사용하고,

textfield.bezeled = NO; 
textfield.drawsBackground = NO; 
textfield.editable = NO; 
textfield.selectable = YES; 
[textfield setRefusesFirstResponder: YES]; 
관련 문제