2014-10-30 2 views
1

보기 컨트롤러간에 Cocoa Bindings를 사용하는 경우에 어려움을 겪고 있습니다. 영감에 대한 링크를 확인했지만 여전히 그렇지 않습니다. 나는 그것이 ...윈도우의 여러보기 컨트롤러에서 바인딩하는 코코아

비슷한 주제를 질문을 게시하고 내 마음을 조금 휴식을하는 것이 좋습니다 생각 : Binding selection across multiple view controllers in a single window interface

Sharing an NSArrayController between multiple views in separate NIB files

내가 두 개의 사용자 정의보기 하나의 메인 컨트롤러 MainViewController.m/.h/.xib 있습니다.

별도의보기 컨트롤러 SecondViewController.m/.h/.xib도 있습니다. 그 xib는 기본적으로 테이블 뷰의 열에 바인딩 된 ArrayController와 함께 테이블 뷰를 포함합니다. 이것은 바인딩 및 선택 등에서 잘 작동합니다.

이제 주 컨트롤러로 돌아와서 테이블보기로 선택 색인 인 SecondViewController에 액세스하고 싶습니다.

나의 시도는 지금까지

  1. 내 주요 XIB에서, 나는 IB에서의 ViewController를 작성 SecondViewController에 사용자 정의 클래스와 nib 파일을 설정합니다.

  2. SecondViewController의 XIB에 ArrayController가 작성되었으며, contentArray는 KVC 목록 속성 'lists'로 설정됩니다. 위에서 언급 한 것처럼 테이블 뷰에 내용이 올바르게 표시됩니다.

    Q : SecondViewController에서 선택한 객체에 액세스 할 수있는 방법으로 MainViewController에서 바인딩을 설정하려면 어떻게해야합니까? 왜냐하면 그 객체에 대한 세부 정보를 메인 뷰 컨트롤러의 서브 뷰로 그려야하기 때문입니다. Cocoa Tutorials에 설명 된 마스터 - 세부 인터페이스의 종류. 당신이 할을 관찰 키 - 값을 사용하려면

+0

SecondVC 인스턴스를 가리키는 MainVC의 secondVC 콘센트를 만듭니다. SecondVC의 테이블 뷰를 가리키는 SecondVC의 tableView 콘센트가 있어야합니다. MainVC에서 secondVC.tableView.selectionIndex ...라는 키 패스를 사용 하시겠습니까? 꽤 바닐라 물건이기 때문에 좀 더 복잡한 것을하려고하는지 궁금합니다. – stevesliva

+0

아마도 쉽습니다. 그래서 내 mainvc에서 나중에 노출하기 위해 secondVC에서 tableview 콘센트가 필요하다는 뜻입니까? btw에는 selectionIndex가없고 selectedRowIndexes 만 있습니다 - 그게 무슨 뜻입니까? – Rabiees

+0

그래, 의미. 그러나 MainVC가 secondVC 인스턴스를 추적하기 위해 약간의 작업을 수행하는 한 (nil 포인터는 사용하지 않음) 계층 적 keypath를 바인딩 할 수없는 이유는 없습니다. – stevesliva

답변

1

은 당신의 SecondViewController에 의해 관리되는 테이블에서 선택된 행에 대한 변경 사항을 인식 MainViewController, 내가 할 수있는 가장 좋은 방법은이 값을 설정하는 것입니다 생각 NSArrayController 바인딩 Selection Indexes (두 번째 테이블보기에 내용을 제공하는 어레이 컨트롤러). 당신의 SecondViewController 클래스 파일에서

이 같은 속성을 추가 :

@property (nonatomic, copy) NSIndexSet *secondTableSelectedIndexes; 

지금, SecondViewController.xib에서와 관계있는 녹색 NSArrayController 큐브를 선택이 바인딩 관리자의로 이동하고 인덱스 설정 속성을 참조하는 바인딩 Selection Indexes을 설정하면 방금 만들었습니다. 이것은 읽기 - 쓰기 바인딩입니다. 코드에서 코드를 직접 작성하지는 않을 것입니다 (원할 경우 가능). 그러나 SecondViewController 관리되는 테이블에서 새 행을 선택할 때마다이 인덱스 세트가 자동으로 업데이트되므로이 속성을 관찰하게됩니다 . 둘 다보기 컨트롤러에 액세스 할 수있는 곳이라면 어디서나

는 다음을 추가, 관찰자를 설정하려면 :

/* Have my main view controller watch for selection changes in my 
* second view controller's table 
*/ 

self.secondViewController = [[SecondTableViewController alloc] initWithNibName:@"SecondTableViewController" bundle:nil]; 

[self.secondViewController addObserver:self.mainViewController 
     forKeyPath:@"secondTableselectedIndexes" 
      options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionPrior 
      context:nil]; 

변경 secondTableSelectedIndexes에 다음 MainViewController-observeValueForKeyPath:ofObject:change:context:를 구현하여 포착 할 수 있습니다.

+0

ok 제가 선택 색인을 위해 노력하겠습니다. 그러나 올바른 문자열을 테이블 뷰로 가져 오는 문제는 여전히 남아 있습니다. "("가 표시됩니다. – Rabiees

+0

어떤 테이블 뷰? "SecondTableViewController"xib에 테이블 뷰가 있으며, "MainViewController"에도 하나가 있습니다. 만약 두 번째 뷰 컨트롤러에서''MainViewController''를 선택과 나란히 유지하기를 원한다면, 선택 인덱스를 망칠 필요가 없습니다. 테이블 뷰의 수를 명확히하면, 바인딩을 설명 할 수 있습니다 –

+0

간단한 문자열 배열을 사용하여 샌드 박스 프로젝트에서이 작업을 시도했습니다. 내 mainvc에는 두 개의 배열 컨트롤러와 두 개의 열이있는 한 개의 테이블보기가 있습니다. 첫 번째 열은 mainarraycontroller.arrangedObjects에 바인딩됩니다. 두 번째 열은 바인딩됩니다. SecondArrayController의 contentArray는 self.secondViewController.tableArray에 바인딩됩니다 (secondViewController는 IBOutlet 속성입니다). 첫 번째 열은 괜찮습니다. 두 번째 열은 "(". – Rabiees