Предлагаемое решение для NSTreeController, отображающее дублирующиеся объекты - PullRequest
2 голосов
/ 03 июля 2010

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

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

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

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

Ответы [ 2 ]

1 голос
/ 03 июля 2010

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

0 голосов
/ 10 августа 2010

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

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

...