Странное поведение NSOutlineView

#swift #xcode #interface-builder

#swift #xcode #конструктор интерфейса

Вопрос:

Прошу прощения за расплывчатое название, но я, честно говоря, не знаю, как лучше выразиться. В настоящее время я пытаюсь создать простой NSOutlineView. Идея состоит в том, чтобы отсортировать некоторые города по их штатам. Ниже показано, как должен выглядеть NSOutlineViewПравильный макет

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

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

Я видел похожие вопросы, где они рекомендовали отключить Floats Group Rows , что я и сделал, но ничего не изменилось.

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

Ответ №1:

Хорошо, я нашел решение для всех, у кого в будущем возникнут подобные проблемы. В документах Apple они заявляют:

Важно

Возможно, что ваши методы источника данных для заполнения представления структуры могут быть вызваны перед awakeFromNib(), если источник данных указан в Interface Builder. Вы должны защититься от этого, заставив метод outlineView источника данных(_:numberOfChildrenOfItem:) возвращать 0 для количества элементов, когда источник данных еще не настроен. В awakeFromNib() при инициализации источника данных вы всегда должны вызывать reloadData().

Поэтому я вызвал reloadData() in awakeFromNib() проблема, однако, заключалась в том, что awakeFromNib() вызывалось несколько раз всякий раз, когда вы разворачиваете элемент, эти множественные перезагрузки вызывали проблему с отображением элементов, следовательно, моим решением было просто удалить reloadData() из awakeFromNib()