Post

Replies

Boosts

Views

Activity

Reply to Observe a tree of Core Data relationships?
Yes, there was an option I missed. NSTreeController seems to handle this really well, with a few small quirks. I had to add a 'rules' property to my rule. Simple extension: extension Rule { @objc public var rules: NSSet? { return self.passToLayer?.rules } } Setting up the binding was a little weird, as I've never done that in code before. Wound up with roughly this: @IBOutlet var ruleViewContainer:NSView! var ruleOutlineView:NSOutlineView = NSOutlineView() private var layerToShow:Layer private var treeController:NSTreeController = NSTreeController() ... override func viewWillAppear() { ... let outlineContainer = NSScrollView(frame:ruleViewContainer.bounds) outlineContainer.autoresizingMask = [.width, .height] outlineContainer.documentView = ruleOutlineView outlineContainer.hasVerticalScroller = true outlineContainer.hasHorizontalScroller = true ruleViewContainer.addSubview(outlineContainer) ruleOutlineView.usesAlternatingRowBackgroundColors = true ruleOutlineView.usesAutomaticRowHeights = true ruleOutlineView.delegate = self ruleOutlineView.dataSource = self ruleOutlineView.doubleAction = #selector(self.doubleClick) ruleOutlineView.target = self treeController.childrenKeyPath = "rules" treeController.bind(NSBindingName.content, to: layerToShow, withKeyPath: "rules", options: nil) ruleOutlineView.bind(NSBindingName.content, to: treeController, withKeyPath: "arrangedObjects", options: nil) } Now all the items in the NSOutlineView are of type NSTreeNode. This broke my existing drag-and-drop and outlineView(_ outlineView:, viewFor tableColumn:, item:). Easy enough to fix. Just wrap all the references to item like this: let representedItem = (item as! NSTreeNode).representedObject Then use representedItem just like you used item before. I handle the updates in my API interaction object, which then updates my Core Data store if the server confirms the attempted change was successful. The UI then updates. I still have a few weird glitches. Moved objects are sometimes out of order. That should be much easier to figure out, though.
Topic: App & System Services SubTopic: iCloud Tags:
Aug ’21
Reply to Observe a tree of Core Data relationships?
Yes, there was an option I missed. NSTreeController seems to handle this really well, with a few small quirks. I had to add a 'rules' property to my rule. Simple extension: extension Rule { @objc public var rules: NSSet? { return self.passToLayer?.rules } } Setting up the binding was a little weird, as I've never done that in code before. Wound up with roughly this: @IBOutlet var ruleViewContainer:NSView! var ruleOutlineView:NSOutlineView = NSOutlineView() private var layerToShow:Layer private var treeController:NSTreeController = NSTreeController() ... override func viewWillAppear() { ... let outlineContainer = NSScrollView(frame:ruleViewContainer.bounds) outlineContainer.autoresizingMask = [.width, .height] outlineContainer.documentView = ruleOutlineView outlineContainer.hasVerticalScroller = true outlineContainer.hasHorizontalScroller = true ruleViewContainer.addSubview(outlineContainer) ruleOutlineView.usesAlternatingRowBackgroundColors = true ruleOutlineView.usesAutomaticRowHeights = true ruleOutlineView.delegate = self ruleOutlineView.dataSource = self ruleOutlineView.doubleAction = #selector(self.doubleClick) ruleOutlineView.target = self treeController.childrenKeyPath = "rules" treeController.bind(NSBindingName.content, to: layerToShow, withKeyPath: "rules", options: nil) ruleOutlineView.bind(NSBindingName.content, to: treeController, withKeyPath: "arrangedObjects", options: nil) } Now all the items in the NSOutlineView are of type NSTreeNode. This broke my existing drag-and-drop and outlineView(_ outlineView:, viewFor tableColumn:, item:). Easy enough to fix. Just wrap all the references to item like this: let representedItem = (item as! NSTreeNode).representedObject Then use representedItem just like you used item before. I handle the updates in my API interaction object, which then updates my Core Data store if the server confirms the attempted change was successful. The UI then updates. I still have a few weird glitches. Moved objects are sometimes out of order. That should be much easier to figure out, though.
Topic: App & System Services SubTopic: iCloud Tags:
Replies
Boosts
Views
Activity
Aug ’21