Реализовать вид дерева в виде Finder и представить его узлы с отложенной загрузкой с помощью NSOutlineview - PullRequest
0 голосов
/ 27 февраля 2020

При реализации большого дерева файловой системы в NSOutlineview отсутствует уведомление о событии, когда пользователь щелкает значок треугольника левой стрелки вниз узла. Это очень важно при отложенной загрузке большого количества файловых узлов в узел каталога и представлении его в NSOutlineview. В противном случае разработчик должен загрузить в него весь каталог, таким образом, загрузка заставит конечного пользователя ждать, это недопустимо. Короче говоря, текущая версия NSOutlineview не может реализовать отложенную загрузку, вызванную этой проблемой. Кто-нибудь встречает эту проблему или имеет альтернативное решение для реализации Finder-подобного дерева с Cocoa NSOutlineview, любая помощь будет очень полезна.

Кроме того:

NSOutlineview не генерирует событие outlineViewItemWillExpand если щелкнуть значок, и все еще не хватает информации, чтобы определить, какой узел развернется, даже если это событие было отправлено, [NSOutlineview selectedRow] не может работать, поскольку узел, который будет развернут, еще не выбран.

1 Ответ

1 голос
/ 28 февраля 2020

Я загружаю свои дочерние узлы в следующем вызове в NSOutlineViewDataSource:

func outlineView(_ outlineView: NSOutlineView, isItemExpandable item: Any) -> Bool {
        guard let node = item as? Node else { return false }
        return node.children.count > 0
    }

Свойство children моего класса Node является ленивым и, следовательно, принудительно загружается здесь.

Этот метод вызывается только на узлах, которые видны в планировщике. Таким образом, вы загружаете только один слой перед видимым деревом. Треугольник раскрытия (стрелка раскрытия) будет виден, если дочерние элементы существуют.

Если у вас есть эффективный способ узнать количество дочерних элементов, которые есть у узла, без их фактической загрузки, то может быть лучше просто вернуть число детей в outlineView(_: isItemExpandable:) и затем фактическая нагрузка в outlineViewItemWillExpand(_:), как предложил Виллек в комментариях.

...