2014-05-09 3 views
2

NSTableView 내에서 NSTableView를 표시하려고합니다. iTunes와 같은 앨범/트랙보기 용입니다. 그래서 10 개의 앨범 목록이 있습니다. 각 앨범마다 트랙이 있습니다. 바깥 쪽 테이블보기에 앨범을 표시하고 안쪽에있는 각 앨범의 트랙을 표시하려고합니다.코코아 바인딩 NSTableView 내 NSTableView

첫 번째 NSTableView는 NSArrayController에 바인딩됩니다. 배열의 각 객체에는 NSArrayController라는 고유 한 "트랙"이 있지만 '트랙'NSTableView에 '앨범'NSTableView의 속성에서 가져온 내용을 전달하는 방법을 알 수 없습니다.

+1

프로젝트를 보면서 내 대답을 삭제했습니다. Nibs/XCode는 objectValue가 중첩 된 트랙 셀이 아니라 앨범이라고 생각하는 것 같습니다. 셀에 포함 된 배열 컨트롤러로 작업하는'objectValue' 바인딩을 얻는 방법을 알 수 없습니다. 말하자면, IB의 셀 뷰에 AC 객체를 중첩시킬 수 없습니다. 내 생각은 전체 앨범 셀을 사용자 정의보기 Nib로 만들고 어레이 콘센트를 연결하는 것입니다. 새로운 Nib에서 XCode는 어레이 컨트롤러 개체를 찾을 수 있습니다. – stevesliva

답변

-1

문제는 MVC 패턴 (모델보기 컨트롤러)을 이해하지 못하는 데 있습니다. 뷰의 컨텐트는 다른 뷰에서 가져 오지 않으며 컨트롤러를 통해 모델 객체에서 가져옵니다. 각 tableviews의 내용은 항상 NSObjectController 또는 NSArrayController와 같은 하위 클래스에서 가져옵니다.

  • 바인드
  • 는 '트랙'어레이 제어기를 만들고 '앨범'의 선택에 바인딩 '앨범'어레이 제어기의 선택에 '트랙'의 tableview : 기본적으로, 두 용액이있다 어레이 제어기. '트랙'배열 뷰어를 '트랙'배열 컨트롤러에 바인딩하십시오.

세 번째 해결 방법은 NSTreeController를 NSOutlineView와 함께 사용하는 것입니다. 윤곽선보기 및 트리 컨트롤러는 악명이 높습니다.

+0

이것은 실제로 올바르지 않습니다. 그것은 [표준 연습]입니다 (https://developer.apple.com/library/mac/documentation/cocoa/conceptual/TableView/PopulatingViewTablesWithBindings/PopulatingView-TablesWithBindings.html#//apple_ref/doc/uid/10000026i-CH13-SW4).) 'NSTableCellView'의'objectValue' 속성에 바인드 될 서브 뷰를 위해 셀 뷰로'NSTableCellView'를 사용하는 뷰 기반 테이블을 가지고 있습니다. 실제로 NSTableCellView는 셀의 객체 컨트롤러입니다. –

+0

MVC를 완벽하게 이해합니다. 모델이 근본적으로 배열의 배열이라고 말한 부분을 놓쳤습니다. 외부 tableview는 최상위 배열에 바인딩됩니다. 까다로운 부분은 내부 테이블 뷰를 하위 배열에 바인딩하는 것이 었습니다. 나는 거의 @stevesliva가 추천 한 것과 효과가 있었던 것을 끝내었다. 그것은 내가 좋아했을 것보다 더 많은 파일에 퍼져 있지만 일을 끝내게됩니다. – jsd

+0

@jsd "트랙 '테이블 뷰에 내용을'앨범 '테이블 뷰의 속성에서 가져 오는 방법을 알아낼 수 없다면 MVC에 대한 이해가 부족합니다. 죄송합니다. 자네가 자존심을 상하게하면. –

2

네가 맞다면, 중첩 된 배열 컨트롤러의 소스 내용은 소유자 테이블 셀의 objectValue에서 나온다. 따라서 배열 컨트롤러 내용 소스를 표 셀의 objectValue로 설정할 수 없습니다. 객체의 값에 따라 배열 내용을 필터링하고 싶습니다. 비슷한 점이 있습니다.

내가하고있는 것처럼 보이는 것은 중첩 된 테이블 셀 뷰를 위해 별도의 nib 파일을 만드는 것입니다. 그것은 자신의 nstablecellview 하위 클래스입니다. nib에 어레이 컨트롤러를 포함하고 셀 뷰 하위 클래스에서 콘센트를 만듭니다. 수동으로 객체 값을 요구하여 바인딩을, 휴대 뷰 서브 클래스의 awakeFromNib 메소드에서, 그리고

NSNib *cellView = [[NSNib alloc] initWithNibNamed:@"MyTableCellView" bundle:nil]; 
[myTableView registerNib:cellView forIdentifier:@"myTableCellView"]; 

:

테이블의 viewDidLoad에 방법에 테이블 뷰에 등록 컨트롤러를 볼 수

[self.arrayController bind:@"contentSet" 
        toObject:self 
       withKeyPath:@"objectValue.tracks" 
        options:nil]; 

Voila.

이 기술을 사용할 때 nib 파일의 소유자가 nstablecellview 하위 클래스가 아니므로 테이블보기의보기 컨트롤러입니다.