2013-05-25 5 views
0

이와 비슷한 질문이있는 일부 스레드를 보았지만 그 문제는 해결되지 않았습니다. TextCield, DatePicker 및 Button과 같은 각 TableCellView에서 몇 가지 클릭 할 수있는 요소로 NSTableView를 만들었습니다. 먼저 해당 행을 선택하지 않고이 각각을 클릭 할 수 있어야합니다. by setSelectionHighlightStyle: NSTableViewSelectionHighlightStyleNone 그러나 각 행과 연관된 모델 객체에 편집 내용을 전달해야하므로 편집중인 행의 색인을 알아야합니다. 나는 다음과 같은 글을 쓰려고 시도했다. 그것은 내가 언급 한 다른 스레드의 제안 이었지만, 아무 것도하지 않았다.NSTableView 선택 강조 표시는 없지만 선택된 행을 계속 추적합니다.

- (BOOL)tableView:(NSTableView *)tableView shouldTrackCell:(NSCell *)cell forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{ 
    return YES; 
} 

잘못된 방법으로 사용하고 있는지, 아니면 잘못 구현했는지 100 % 확신 할 수 없습니다. 내가 어떻게 이것에 관해 갈 수 있었는지에 관해 어떤 팁이라도 굉장 할 것이다.


편집 :

여기에 스티브 Waddicor의 제안 구현하려고 시도한입니다 :

의 ViewController NSTableViewDataSource 만들기

와 개체에 대한 위임 (코드 MyViewController.m에 그대로 TableCellView 설정이) :

- (void)awakeFromNib{ 
    [self.tableView setDataSource:self]; 
} 
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 
{ 
    CustomTableCellView *view = [self.tableView makeViewWithIdentifier:@"MyIdentifier" owner:self]; 
    [view.textField setDelegate:view]; 
    [view.datePicker setDelegate:view]; 
    return view; 
} 


//----------------------- 
//----------------------- 
//----------------------- NSTableViewDataSource Protocol Requirements: 


- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView 
{ 
    return [self.tableView numberOfRows]; 
} 

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex 
{ 
    return [self.tableView rowViewAtRow:rowIndex makeIfNecessary:NO]; 
} 

및 CustomTableCellView에서 이것은 위임자입니다.

- (void)mouseDown:(NSEvent*) theEvent{ 
    NSLog(@"TEST"); 
} 
+0

시도 : 당신의있는 tableView 데이터 소스 내의이 같은 방법 뭔가가? –

+0

@AndrewMadsen 예보기 기반입니다. –

+0

테이블보기에'-clickedRow' 메시지를 보내면 가장 최근에 클릭 한 행의 색인을 찾을 수 있습니다 (선택 여부에 관계없이). 예 :'NSInteger index = self.tableView.clickedRow'. 그것도 작동하지 않는다면 항상 NSTableRowView를 서브 클래스 화하고'representingObject','objectValue' 등의 속성을 추가 할 수 있습니다. 그런 다음'NSTableViewDelegate' 메소드'-tableView : rowViewForRow :'를 사용하여 행 뷰를 반환 할 때 모델 객체를 새로 생성 된 속성에 할당 할 수 있습니다. 다음 주석에 계속 ... –

답변

1

당신은의 대리인으로 당신의 tableCellView을 설정할 수 있습니다 : 대표 올바르게 개체에 대한 설정되지 않습니다 믿고 날 리드 I가 텍스트 필드를 클릭 할 때 호출되지 않는 방법, 통제 수단. 거기에서 당신은

NSTableView* tableView = self.superview; 
NSUInteger row = [tableView rowForView:self]; 

편집

대리자를 만들려면 수 있습니다.

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 
{ 
    MyTableCellView* view = [outlineView makeViewWithIdentifier:@"MyIdentifier" owner:self]; 
    [view.textField setDelegate:view];   
    [view.datePicker setDelegate:view];   
    [view.button setDelegate:view]; 
    return view; 
} 
+0

이것은 좋은 생각 인 것 같지만 tableCellView를 컨트롤의 위임자로 설정하는 데 문제가 있습니다. (미안하지만, 나는 전에 이것을 시도한 적이 없다). 'initWithCoder :'메소드에는'[self.assignName setDelegate : self];'TextField에 대한 위임자를 설정하려고 시도했지만 프로그램을 실행하는 동안 그것을 클릭하면'mouseDown :'메서드가 호출되지 않기 때문에 작동하지 않는다고 생각합니다. –

+0

프로그램의 어떤 assignmentName이 무엇인지, 또는 어떤 클래스에 언급 된 initWithCoder가 있는지 모르겠습니다. 내 대답을 일부 일반 코드로 업데이트하겠습니다. –

+0

죄송합니다. 내 의견이 모호했다는 것을 알았습니다. 조금 나중에 편집하려고했지만 나에게 허락하지 않았습니다. 내가 작성한 코드를 사용하여 원래 게시물을 편집했습니다. 모든 도움을 주셔서 감사합니다 –

1

당신은 참으로보기 기반 테이블보기가 아닌 셀 기반 테이블보기, 올바른을 사용하는이 위양

- (BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(NSInteger)rowIndex 
    { 
    return YES; 
    } 
+0

선택이 변경되면 (즉,'tableViewSelectionDidChange :'가 호출되지 않음) 여전히 인식하지 못하기 때문에 이것이 작동하지 않는다고 생각합니다. –

관련 문제