2014-12-02 2 views
0

나는 몇개의 열을 가진 NSTableView를 가지고있다. 열은 NSButtonCells에 의해 만들어집니다. 각 NSButtonCell에는 특정 태그가 있습니다. 이 태그는 메소드를 호출 한 셀을 지정하기 위해 조치 메소드 내에서 사용해야합니다.액션과 함께 NSButtonCell의 태그를 어떻게 보내나요?

액션과 함께 전달 된 Sender 객체가 NSButtonCell이 아닌 NSTableView이기 때문에 셀의 태그를 설정하는 것은 쓸모가 없습니다.

cell = [[NSButtonCell alloc] init]; 
       [cell setAction:@selector(openScreen:)]; 
       [cell setTag:tag]; 
       [cell setTarget:self]; 


-(void)openScreen:(id)sender //this sender is NSTableView, so i can't get the tag of the cell 
+0

조금 더 자세히 설명해 주시겠습니까 –

+0

@AnoopVaidya 더 나은가요? – aneuryzm

+0

'[[보낸 사람 superview] superview] 시도해도 될까요? ... 나는 이것이 트릭을 할 것이라고 생각합니다. –

답변

0

첫 번째 권장 사항은보기 기반 테이블보기로 전환하는 것입니다. 이 경우 보낸 사람은 테이블보기가 아닌 NSButton 인스턴스가 될 것이므로이 문제는 대부분 사라집니다.

할 수 없다면 질문 : 셀에 사용할 태그를 어떻게 계산합니까? Astoria의 대답을 사용하는 대신 (주석에 따라 수정) 특정 행, 열의 태그를 계산할 때 사용한 논리와 동일한 논리를 사용하여 작업 메서드의 목적에 맞는 값을 계산할 수 있습니다.

생각 해봐야합니다. 셀 기반 테이블보기는 일반적으로 전체 열에 대해 하나의 셀을 재사용합니다. 그것은 (데이터 소스 또는 바인딩을 통해 얻은) 객체 값을 설정하여 셀을 구성한 다음 -tableView:willDisplayCell:forTableColumn:row:을 호출하여 델리게이트가 더 이상 구성하도록합니다. 셀에 태그가 지정되면이 시점에서 완료되지만 행과 열에 기반합니다.

모든 rigmarole을 통과하는 준비된 셀에 대해 테이블보기를 요청하는 대신, 처음에 태그를 지정하는 데 사용할 논리와 동일한 로직에 clickedRowclickedColumn을 입력하면됩니다.

또 다른 접근법은 바인딩을 사용하는 것입니다. 셀 기반 테이블 뷰의 경우 열이 NSButtonCell을 사용하도록 구성된 경우 열에는 동작 호출 바인딩이 있습니다. Target에 바인드하고 Selector를 지정하면 Selector에 대한 인수로 전달되는 Argument가 있습니다. 이 경우 선택기는 "보낸 사람"을받지 못합니다. 그냥 일반적인 인수를받습니다. 테이블 열이 데이터에 대한 배열 컨트롤러에 바인딩되어 있으면 인수도 배열 컨트롤러에 바인딩 할 수 있습니다. 동일하거나 다른 모델 키 경로를 사용할 수 있습니다.

기본적으로이 경우 영향을받는 행을 조회 할 수있는 정보를 전달하지 않고 해당 행이 나타내는 객체에서 또는 그 객체에 대한 데이터를 직접 전달합니다. 마찬가지로 테이블이 Employee을 나타내는 경우 실제 Employee 인스턴스를 작업 메서드에 전달할 수 있으며 행, 열, 태그 등을 사용하여 간접 조회를 수행 할 필요가 없으므로 Employee이 작동하는지 확인할 수 있습니다.

또한 뷰 기반 테이블 뷰에서이 바인딩 접근법을 사용할 수 있지만 실제 버튼 객체를 바인딩하면 NSTableCellViewobjectValue을 인수로 사용할 수 있습니다.

관련 문제