2

두 개의보기 컨트롤러에 걸쳐 몇 개의 NSArrayController를 연결하는 방법에 대해 머리를 감싸는 데 문제가 있습니다. 두 번째 상세보기 컨트롤러의 값을 업데이트하려면 소스 목록 테이블보기에서 선택 항목을 동기화하고 싶습니다.하나의 창 인터페이스에서 여러보기 컨트롤러에 걸쳐 선택 바인딩

저는 Cocoa Dev Central Build A Core Data Tutorial을 시작점으로 사용하지만 두 개의 NSViewController가 포함 된 NSWindowController가 있도록 아키텍처를 무너 뜨 렸습니다. 하나는 왼쪽의 posts 테이블이고 다른 하나는 오른쪽의 게시물 세부 정보입니다.

NSWindowController 서브 클래스는 포스트 엔티티와 나는 다음 windowDidLoad 방법에있는 두 개의 뷰 컨트롤러를 초기화

[[NSApp delegate] managedObjectContext]를 가리키는 읽기 전용 managedObjectContext 접근에 바인딩 된 NSArrayController 있습니다.

- (void)windowDidLoad 
{ 
    static NSInteger kSourceListViewIndex = 0; 
    static NSInteger kDetailViewIndex = 1; 

    self.postsListsViewController = [[MDVCPostsListViewController alloc] initWithWindowController:self]; 
    NSView *sourceListSplitViewContentView = [[self.splitView subviews] objectAtIndex:kSourceListViewIndex]; 
    NSView *sourceListView = [self.postsListsViewController view]; 
    [sourceListView setFrame:[sourceListSplitViewContentView bounds]]; 
    [sourceListView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)]; 
    [sourceListSplitViewContentView addSubview:sourceListView]; 

    // And now let's load the detail view. 
    self.postDetailViewController = [[MDVCPostDetailViewController alloc] initWithWindowController:self]; 
    NSView *detailSplitViewContentView = [[self.splitView subviews] objectAtIndex:kDetailViewIndex]; 
    NSView *detailView = [self.postDetailViewController view]; 
    [detailView setFrame:[detailSplitViewContentView bounds]]; 
    [detailView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)]; 
    [detailSplitViewContentView addSubview:detailView]; 
} 

MDVCPostsListViewController

MDVCPostDetailViewController (모든 인터페이스 빌더를 통해) 부모 윈도우 컨트롤러의 관리 개체 컨텍스트에 바인딩 포스트 엔티티 및 관리되는 개체 컨텍스트에 NSArrayController을 구속했다가 윈도우 컨트롤러의 관리에 NSObjectController를 결합했다 객체 콘텍스트와 콘텐트 객체는 postsListsViewController.postsArrayController.selection을 통해 윈도우 콘트롤러에 바인딩된다. 이것은 정말 짜증나는 해킹처럼 보입니다.

MDVCPostsListViewController의 테이블보기에서 선택 사항을 변경하면 MDVCPostDetailViewController에 선택된 값이 업데이트되도록 어떻게 얻을 수 있습니까? 나는 가깝다고 느낀다. 그러나 무엇이 빠졌는지, 또는 가장 좋은 길은 무엇인지를 확신하지 못한다. 나는 postsListsViewController.postsArrayController.selection 바인딩이 극단적으로 해킹 된 것처럼 느낍니다. 잘하면 더 좋은 방법이 있습니다.

설명을 읽는 대신 코드를 보는 것을 선호하는 사람들을 위해 샘플 프로젝트를 업로드했습니다. 내 사이트에서 가져올 수 있습니다 http://www.secondgearsoftware.com/attachments/stackoverflow_objectcontroller.zip

답변

3

어떻게 각 창 컨트롤러가 주 창 컨트롤러를 검색 할 것으로 예상합니까?

프로젝트를 한눈에 볼 때 MDVCMainWindowController 인스턴스를 각 NIB에 추가 한 것 같습니다. 이것들은 실제로 메인 윈도우를 실행하는 인스턴스와 별개의 인스턴스가 될 것입니다.

원본 목록 테이블 selectionIndexes를 Post 배열 컨트롤러에 바인딩해야합니다. 그렇지 않으면 컨트롤러 레벨에서 선택을 알 수 없습니다.

어레이 컨트롤러를 메인 윈도우 컨트롤러로 옮기는 것이 좋습니다. 그런 다음 windowDidLoad 메서드에서 목록 및 세부 정보보기로 전달할 수 있습니다. 목록은 arrangedObjects 및 selectionIndexes에 바인딩되며, 상세 뷰는 selection.someKey에 바인딩됩니다.

+0

알았어요. 감사! –

1

문제는 상세 뷰 xib에서 NSObjectController 인스턴스의 콘텐츠 객체 바인딩에 있습니다. 목록보기 xib에있는 배열 컨트롤러가 KVO 알림을 올바르게 게시하고 있습니다 (MDVCPostDetailViewController 인스턴스를 KVO로 관찰하여 확인). 이유는 모르지만 개체 컨트롤러가 응답하지 않습니다.

그러나 실제로 적용 할 수있는 몇 가지 방법이 있습니다. 객체 컨트롤러를 없애고 상세보기 xib의 텍스트 필드 등을 어레이 컨트롤러 (File의 Owner.windowController.postsListsViewController.postsArrayController.selection.whatever)로 직접 바인드 할 수 있습니다.또는 객체 컨트롤러를 유지하고 상세보기 컨트롤러에서 어레이 컨트롤러의 선택 속성을 관찰하고 선택 항목이 변경 될 때 객체 컨트롤러의 내용 객체 속성을 수동으로 설정할 수 있습니다.

관련 문제