NSOutlineView привязан к NSTreeController (узлы рушатся при изменении размера окна)

Я могу успешно связать NSTreeController с NSOutlineView с помощью Interface Builder. И когда я пытаюсь сделать то же самое программно, я также могу заставить это работать, за исключением одной маленькой проблемы.

Изменение размера окна, к которому привязан вид структуры, сворачивает все открытые элементы. Если я изменю размер представления структуры другим способом, например, поместив его в NSSplitView, перемещение ползунка вверх и вниз не вызовет никаких проблем. Это происходит только при изменении размера окна.

Представление схемы — это просто представление по умолчанию в Interface Builder. Я бросил его на окно, заколол со всех четырех сторон, подключил розетку к моему ViewController и все.

У кого-нибудь есть понимание? Спасибо.

Вот как я создаю вещи программно:

override func viewWillLayout() {
    super.viewWillLayout()

    var treeController: NSTreeController!
    @IBOutlet weak var outlineView: NSOutlineView!
    var content = [TreeNode]()

    newTreeController = NSTreeController.init(content: nil)
    newTreeController.objectClass = TreeNode.self
    newTreeController.childrenKeyPath = "children"
    newTreeController.countKeyPath = "count"
    newTreeController.leafKeyPath = "leaf"
    newTreeController.preservesSelection = true
    newTreeController.isEditable = true
    newTreeController.bind("contentArray", to: self, withKeyPath: "content", options: nil)

    outlineView.delegate = self
    outlineView.bind("content", to: newTreeController, withKeyPath: "arrangedObjects", options: nil)
    outlineView.bind("selectionIndexPaths", to: newTreeController, withKeyPath: "selectionIndexPaths", options: nil)
}

override func viewDidLoad() {
    super.viewDidLoad()

    willChangeValue(forKey: "content")
    // POPULATE CONTENT ARRAY
    didChangeValue(forKey: "content")
}

// NSOutlineViewExtension

func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {
    var cellView: NSTableCellView?
    if let identifier = tableColumn?.identifier {
        if let view = outlineView.make(withIdentifier: identifier, owner: outlineView.delegate) as? NSTableCellView {
            // view.imageView?.bind(NSValueBinding, to: view, withKeyPath: "objectValue.WHATEVER_PROPERTY", options: nil)
            // view.textField?.bind(NSValueBinding, to: view, withKeyPath: "objectValue.WHATEVER_PROPERTY", options: nil)
            cellView = view
        }
    }
    return cellView
}

person user5892643    schedule 04.10.2016    source источник


Ответы (1)


viewWillLayout() — это неправильное место для настройки древовидного контроллера и схемы. Он вызывается неоднократно и не предназначен для такого рода вещей.

Переместил все в viewDidLoad() и проблема решена.

person user5892643    schedule 05.10.2016