2

Как многие из вас могут знать, NSTreeController, привязанный к контурному представлению, может отображать дубликаты при представлении основных объектов данных.Предлагаемое решение для NSTreeController, отображающее повторяющиеся enitities

Временное решение состоит в том, чтобы добавить «parent == nil» в предикаты, но это возвращает только родительские объекты. Если, например, пользователь выполняет поиск суб-сущности, запрошенный суб-объект не будет отображаться.

Решение A (предлагается) относится к подклассу NSTreeController и добавляет переменную NSMutableSet, которая отслеживает объекты, которые в настоящее время отображаются. Эта переменная должна быть выделена в init и выпущена на dealloc.

Когда вызывается «fetchWithRequest: merge: error:», набор должен быть опустошен (я не уверен, будет ли это более эффективным, чем освобождение его и выделение его снова). Каждый раз, когда объект будет добавлен для отображения, проверьте, содержит ли его набор. Если это не так, добавьте его. В противном случае найдите, который ближе к корню (который является сущностью), и либо пропустите его, если его субость, либо замените его ранее включенным.

Я думаю, что должно быть относительно малое влияние на производительность (учитывая, что NSSet использует хеширование). Проблема, с которой я столкнулась, - найти правильный метод для переопределения, чтобы добавить это поведение. В частности, когда NSTreeController обрабатывает извлеченные объекты после вызова «fetchWithRequest: merge: error:».

Если у кого есть идеи или отзывы, дайте мне знать. Спасибо заранее.

+0

Возможно, вы захотите перефразировать, используя правильную терминологию. «Сущность» и «экземпляры объекта» - это две разные вещи. Я думаю, вы имеете в виду «экземпляры объекта, у которого есть отношения родительские/детские отношения». Однако ваше использование «сущности» говорит, что это похоже на «объект, который наследует атрибуты/отношения от родительского объекта», что здесь не имеет особого смысла. –

+0

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

ответ

1

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

Я думаю, что ваша проблема больше связана с пользовательским интерфейсом, не так ли? В этом случае лучший подход (и тот, который я видел во многих известных компаниях и независимых разработчиках) - отображать результаты поиска в простой таблице. Таким образом, результаты могут быть отсортированы по различным атрибутам, и вам не нужно отключать перетаскивание в виде схемы в режиме поиска (чтобы пользователь не пытался изменить древовидную структуру, когда только часть дерева отображается вне контекста).

+0

Я полагаю, что это проблема пользовательского интерфейса, но я чувствую, что это скорее основная проблема. Я действительно хотел бы показать все экземпляры сущностей, которые соответствуют предикату, кроме тех, которые являются дочерними элементами других экземпляров, которые уже отображаются. (Я хочу сделать «умные» папки) Я полагаю, что я могу ограничить поиск корневыми экземплярами. Можете ли вы рекомендовать способ ведения сортировки между отдельными интеллектуальными папками? –

0

Расширяясь на ответе Джошуа, я смог реализовать функцию поиска в своем собственном NSOutlineView, однако он был ограничен корневыми/родительскими объектами в представлении.

Я думаю (например, Джошуа сказал), если вы хотите отфильтровать все объекты, вам нужно будет отобразить результаты в NSTableView.