我有一个使用故事板的基于Mac文档的核心数据应用程序。故事板具有以下布局:
Window Controller
Split View Controller
Table View Controller
Text View Controller
My Core Data模型包含一个Chapter实体,它包含两个属性:title和contents。我希望表视图显示每个章节标题。文本视图显示所选章节的内容。
如果我使用的是xib文件,我会在xib文件中添加一个数组控制器。我将数组控制器绑定到File的所有者以访问我的NSPersistentDocument子类。我将表视图绑定到数组控制器的arrangeObjects属性,并将文本视图绑定到数组控制器的选择。
但随着故事板,事情变得更加复杂。我可以向表视图控制器添加一个数组控制器,将表视图绑定到数组控制器,并在表视图中显示章节标题。但是文本视图控制器无法绑定到该阵列控制器,因为阵列控制器位于另一个场景中。
如何在Interface Builder中添加数组控制器,以便表视图控制器和文本视图控制器都可以访问它并绑定到它?
做这项工作的关键是拥有一个 NSArrayController
每个降序中的实例 NSViewController
子类并通过中央数据源(很可能是您的NSDocument子类)将它们绑定在一起。然后,您可以将此数据源设置为 NSViewController
子类 representedObject
通过你的下降传递它
控制器。这是一个带有一个故事板应用程序的例子 NSWindowController
它有一个内容视图控制器 NSSplitViewController
带有两个子视图控制器(主/细节设置):
class Document: NSDocument {
var dataSource: DataSource? = DataSource()
...
}
class DataSource: NSObject, NSCoding {
var items: [Item] = []
var selectionIndexes: NSIndexSet = NSIndexSet()
...
}
class WindowController: NSWindowController {
override var document: AnyObject? {
didSet {
if let document = self.document as? Document {
self.contentViewController?.representedObject = document
}
}
}
}
class SplitViewController: NSSplitViewController {
override var representedObject: AnyObject? {
didSet {
for viewController in self.childViewControllers as! [NSViewController] {
viewController.representedObject = representedObject
}
}
}
}
诀窍是绑定 representedObject
每个降序视图控制器 NSArrayController
在故事板中。你只需要绑定NOT contentArray
但也是 selectionIndexes
。
结果是 selectionIndexes
两个下降 NSArrayController
s保持同步,因为它们通过中央数据源绑定(DataSource
上例中的子类)。
为了使这一点更加清晰,我创建了一个示例项目,在此处演示: https://github.com/acwright/StoryboardBindingsExample