我有一个使用情节提要的基于Mac文档的Core Data应用程序。故事板的布局如下:
Window Controller
Split View Controller
Table View Controller
Text View Controller
我的核心数据模型包含一个Chapter实体,其中包含两个属性:title和contents。我希望表格视图显示每个章节的标题。文本视图显示所选章节的内容。
如果使用的是xib文件,则将阵列控制器添加到xib文件中。我将数组控制器绑定到文件的所有者,以访问我的NSPersistentDocument子类。我将表视图绑定到数组控制器的rangedObjects属性,并将文本视图绑定到数组控制器的选择。
但是有了情节提要,事情变得更加复杂。我可以将数组控制器添加到表视图控制器,将表视图绑定到数组控制器,并在表视图中显示章节标题。但是文本视图控制器无法绑定到该阵列控制器,因为该阵列控制器在另一个场景中。
如何在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
。您不仅需要绑定contentArray
,还需要绑定selectionIndexes
。结果是两个降序
selectionIndexes
上的NSArrayController
保持同步,因为它们通过中央数据源绑定(在上例中为DataSource
子类)。为了使这一切更加清楚,我创建了一个示例项目,在此处进行了演示:https://github.com/acwright/StoryboardBindingsExample
关于cocoa - 在多个 Storyboard 场景中使用NSArrayController,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26748148/