gpt4 book ai didi

cocoa - 在多个 Storyboard 场景中使用 NSArrayController

转载 作者:行者123 更新时间:2023-12-03 16:03:01 25 4
gpt4 key购买 nike

我有一个使用 Storyboard 的基于 Mac 文档的 Core Data 应用程序。 Storyboard具有以下布局:

Window Controller
Split View Controller
Table View Controller
Text View Controller

我的核心数据模型包含一个章节实体,该实体包含两个属性:标题和内容。我希望表格 View 显示每个章节的标题。 TextView 显示所选章节的内容。

如果我使用 xib 文件,我会向 xib 文件添加一个数组 Controller 。我将数组 Controller 绑定(bind)到文件的所有者以访问我的 NSPersistentDocument 子类。我会将 TableView 绑定(bind)到数组 Controller 的arrangedObjects 属性,并将 TextView 绑定(bind)到数组 Controller 的选择。

但是有了 Storyboard,事情就变得更加复杂。我可以将数组 Controller 添加到 TableView Controller ,将 TableView 绑定(bind)到数组 Controller ,并使章节标题显示在 TableView 中。但是 TextView Controller 无法绑定(bind)到该数组 Controller ,因为该数组 Controller 位于另一个场景中。

如何在 Interface Builder 中添加数组 Controller ,以便 TableView Controller 和 TextView Controller 都可以访问它并绑定(bind)到它?

最佳答案

实现这项工作的关键是在每个降序的 NSViewController 子类中都有一个 NSArrayController 实例,并通过中央数据源(很可能是你的 NSDocument子类)。然后,您可以通过降序传递此数据源作为您的 NSViewController 子类 representedObject Controller 。下面是一个带有 NSWindowController 的 Storyboard应用程序示例,它有一个内容 View Controller ,它是一个带有两个 subview Controller 的 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绑定(bind)到 Storyboard中每个降序 View Controller 的NSArrayController。您不仅需要绑定(bind) contentArray,还需要绑定(bind) selectionIndexes

结果是两个降序 NSArrayController 上的 selectionIndexes 保持同步,因为它们通过中央数据源 (DataSource上例中的子类)。

为了让这一切更清楚,我创建了一个示例项目来演示这一点:https://github.com/acwright/StoryboardBindingsExample

关于cocoa - 在多个 Storyboard 场景中使用 NSArrayController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26748148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com