3

2 つのビュー コントローラー間でいくつかの NSArrayControllers を接続する方法に頭を悩ませている問題があります。ソース リスト テーブル ビューの選択内容を同期して、2 番目の詳細ビュー コントローラーの値を更新したいと考えています。

Cocoa Dev Central Build A Core Data Tutorialを出発点として使用していますが、2 つの NSViewControllers を含む NSWindowController があるようにアーキテクチャを分解しました。1 つは左側の投稿テーブル用、もう 1 つは投稿の詳細用です。権利。

NSWindowController サブクラスには、Post エンティティにバインドされた NSArrayController と、次を指す読み取り専用の managedObjectContext アクセサーがあります。[[NSApp delegate] managedObjectContext]

次に、メソッドで 2 つのビュー コントローラーを初期化しますwindowDidLoad

- (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]; 
}

MDVCPostsListViewControllerPost エンティティにバインドされた NSArrayController と、親ウィンドウ コントローラーの管理オブジェクト コンテキストにバインドされたその管理オブジェクト コンテキストを持ちます (すべて Interface Builder を介して)。

MDVCPostDetailViewControllerには、ウィンドウ コントローラーのマネージド オブジェクト コンテキストにバインドされた NSObjectController と、 を介してウィンドウ コントローラーにバインドされたコンテンツ オブジェクトがありますpostsListsViewController.postsArrayController.selection。これは本当に厄介なハックのようです。

MDVCPostsListViewControllerのテーブル ビューで選択を変更すると、 で選択された値が更新されるようにするにはどうすればよいMDVCPostDetailViewControllerですか? 近づいたような気がしますが、何が欠けているのか、どのルートをたどるのが最善なのかわかりません。postsListsViewController.postsArrayController.selectionバインディングは非常にハッキーだと思います。うまくいけば、より良い方法があります。

説明を読むだけでなくコードを見ることを好む人のために、これを示すサンプル プロジェクトをアップロードしました。私のサイトhttp://www.secondgearsoftware.com/attachments/stackoverflow_objectcontroller.zipから入手できます。

4

2 に答える 2

3

各ウィンドウ コントローラーがメイン ウィンドウ コントローラーをどのように検出すると予想しますか?

プロジェクトを一目見ただけで、MDVCMainWindowController のインスタンスを各 NIB に追加したように見えます。これらは、メイン ウィンドウを実際に実行しているインスタンスとは別のインスタンスになります。

ソース リスト テーブルの selectionIndexes を Post 配列コントローラーにバインドする必要があります。そうしないと、選択内容がコントローラ レベルで認識されません。

アレイコントローラーをメインウィンドウコントローラーに移動することをお勧めします。windowDidLoad メソッドでは、それをリスト ビューと詳細ビューの両方に渡すことができます。リストは ArrangeObjects と selectionIndexes にバインドされ、詳細ビューは selection.someKey にバインドされます。

于 2010-03-03T15:26:12.647 に答える
1

問題は、詳細ビューxibでのNSObjectControllerインスタンスのコンテンツオブジェクトバインディングにあります。リストビューxibのアレイコントローラーはKVO通知を正しく投稿しています(MDVCPostDetailViewControllerインスタンスにKVOでこれを監視させることでこれを確認しました)。そのため、理由はわかりませんが、何らかの理由でオブジェクトコントローラーが応答していません。

ただし、機能するアプローチはいくつかあります。詳細ビューxibのオブジェクトコントローラーを削除し、テキストフィールドなどをアレイコントローラー(ファイルのOwner.windowController.postsListsViewController.postsArrayController.selection.whatever)に直接バインドできます。または、オブジェクトコントローラを保持し、詳細ビューコントローラに配列コントローラの選択プロパティを監視させ、選択が変更されたときにオブジェクトコントローラのコンテンツオブジェクトプロパティを「手動で」設定することもできます。

于 2010-03-03T15:49:25.447 に答える