【发布时间】:2019-04-20 15:46:03
【问题描述】:
我正在尝试在具有多个级别的 MacOS 应用程序中创建大纲视图,这些级别是 SQLite3 中保存的一组数据的摘要。我有一个大纲视图,它使用一个基于模型类的非常简单的 NSMutuableDictionary 的树控制器。
import Cocoa
class Summary: NSObject {
@objc dynamic var name: String
@objc dynamic var trades: Int
@objc dynamic var avgPL: Double
@objc dynamic var pandl: Double
@objc dynamic var parent: String
@objc dynamic var isLeaf: Bool
@objc dynamic var childCount: Int
@objc dynamic var children: [Summary] = []
init(name: String, trades: Int, avgPL: Double, pandl: Double, parent: String, isLeaf: Bool,childCount: Int) {
self.name = name
self.trades = trades
self.avgPL = avgPL
self.pandl = pandl
self.parent = parent
self.isLeaf = isLeaf
self.childCount = childCount
}
@objc func add(child: Summary) {
children.append(child)
}
}
我的简单示例数据是:
let root: [String : Any] = ["name": "Overall","trades":5,"avgPL":200,"pandl":500,"parent":"","isLeaf": false,"childCount": 2 ]
let dict: NSMutableDictionary = NSMutableDictionary(dictionary: root)
let l2a = Summary(name: "L2a", trades: 3, avgPL: 100, pandl: 300, parent: "L1",isLeaf: true,childCount: 0)
let l2b = Summary(name: "L2b", trades: 2, avgPL: 100, pandl: 200, parent: "L1",isLeaf: true,childCount: 0)
dict.setObject([l2a,l2b], forKey: "children" as NSCopying)
我将字典传递给treeController:
treeController.addObject(dict)
这很好地给了我一个可折叠的轮廓:
但我不知道如何为孩子添加更多关卡或孩子。我想在大纲中有多达四个级别。我有所有的 SQL 摘要工作,我尝试了很多填充数组的变体,并试图用数据创建一个字典,但无济于事。我有 children 和 childCount 并且 isLeaf 设置在所有东西上,但是 treecontroller 不喜欢数组抱怨 isLeaf 不符合 KVO。我的数组中的数据看起来是这样的(不是所有的数据但足以看到我在做什么)主级别和所有后续子级都基于上面的Summary模型类。我可以简单地将这个数组转换为字典吗?或者,我可以通过向模型类或其他东西添加键来使其符合 KVO 吗?如果有用的话,我将所有 4 个级别都放在用于构建结果数组的单独数组中:
我应该补充一点,我有一个定义为 NSMutableArray 的 NSObject,它的内容与 treeController 相关联。我的 treeController 绑定到模型类中的每个变量,并且在顶层有:
如果我将构建的数组传递给 treeController,我会收到以下错误:
Failed to set (contentViewController) user defined inspected property on (NSWindow): [<_TtGCs23_ContiguousArrayStorageC11outlinetest7Summary_ 0x604000445160> addObserver:forKeyPath:options:context:] is not supported. Key path: isLeaf
【问题讨论】:
-
类
SummaryKVO 是否符合密钥children、childCount和isLeaf? -
@Willeke 在这方面我唯一知道要做的就是制作 vars
@objc dynamic。 -
我认为我的 KVO 问题与 Interface Builder 相关,我可能在其中输入了不正确的内容。我能够完全剥离树控制器并完全删除绑定并使其以老式方式工作。我仍然希望 KVO 能够正常工作,所以我会继续努力。
标签: xcode9 nsoutlineview swift4.2 nstreecontroller