我在思考如何在两个视图控制器之间连接几个 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获取它