#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()