我有一个使用情节提要的基于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/

10-09 16:28