Я пытаюсь создать схему в приложении 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, установленные для всего, но древовидному контроллеру не нравится массив, жалующийся на то, что isLeaf не совместим с KVO. Мои данные в массиве выглядят так (не все данные, но достаточно, чтобы понять, что я делаю). Основной уровень и все последующие дочерние элементы основаны на приведенном выше классе модели Summary. Могу ли я просто преобразовать этот массив в словарь? Или я могу сделать его совместимым с KVO, добавив ключи в класс модели или что-то в этом роде? У меня есть все 4 уровня в отдельных массивах, которые я использую для построения результирующего массива, если это полезно:
Я должен добавить, что у меня есть NSObject, определенный как NSMutableArray, и его содержимое привязано к 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
Summary
KVO с ключамиchildren
,childCount
иisLeaf
? - person Willeke   schedule 18.11.2018@objc dynamic
. - person Mooky   schedule 18.11.2018