3

我在思考如何在两个视图控制器之间连接几个 NSArrayControllers 时遇到了问题。我想同步源列表视图中的选择以更新第二个详细视图控制器中的值。

我使用Cocoa Dev Central Build A Core Data Tutorial作为起点,但是已经分解了架构,因此有一个包含两个 NSViewControllers 的 NSWindowController:一个用于左侧的帖子表,一个用于帖子的详细信息正确的。

NSWindowController 子类有一个绑定到 Post 实体的 NSArrayController 和一个只读的 managedObjectContext 访问器,它指向[[NSApp delegate] managedObjectContext]

然后我在方法中初始化两个视图控制器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]; 
}

MDVCPostsListViewController有一个 NSArrayController 绑定到 Post 实体,它的托管对象上下文绑定到父窗口控制器的托管对象上下文(全部通过 Interface Builder)

MDVCPostDetailViewController有一个 NSObjectController 绑定到窗口控制器的托管对象上下文,并且内容对象通过postsListsViewController.postsArrayController.selection. 这似乎是一个非常糟糕的黑客攻击。

我怎样才能得到它,以便更改MDVCPostsListViewController表视图中的选择将更新中的选定值MDVCPostDetailViewController?我觉得我很接近,但不确定缺少什么或最佳路线是什么。我确实觉得postsListsViewController.postsArrayController.selection绑定非常hacky。希望有更好的方法。

我已经上传了我的示例项目,它为那些喜欢查看代码而不仅仅是阅读描述的人展示了这一点。您可以从我的网站http://www.secondgearsoftware.com/attachments/stackoverflow_objectcontroller.zip获取它

4

2 回答 2

3

您希望每个窗口控制器如何发现主窗口控制器?

快速浏览一下项目,您似乎只是为每个 NIB 添加了一个 MDVCMainWindowController 实例。这些将是与实际运行主窗口的实例不同的实例。

您需要将源列表表 selectionIndexes 绑定到 Post 数组控制器。否则,在控制器级别将不知道选择。

我建议将阵列控制器向上移动到主窗口控制器中。在您的 windowDidLoad 方法中,您可以将其传递给列表和详细信息视图。列表将绑定到排列对象和选择索引,详细视图将绑定到 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 回答