Получение NSOutlineView для прокрутки к новой записи - PullRequest
0 голосов
/ 24 ноября 2010

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

NSInteger row = [self.myOutlineView rowForItem:myItem];
[self.myOutlineView scrollRowToVisible:row];

Я не использую NSTreeController в пользу использования делегирования.

Я использую класс шаблона адаптера для своих данных.Адаптер упаковывает несколько различных типов.Это простая структура:

[дочерние адаптеры] ----- * [родительский адаптер]

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

Итак, с этим здесь и состоит проблема.Когда я добавляю новый элемент в NSOutlineView, я начинаю с добавления нового дочернего адаптера к адаптеру, выбранному в виде структуры.Затем я перезагружаю элемент с потомками, используя:

[self.myOutlineView reloadItem:selectedAdapter reloadChildren:YES];

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

  1. Сначала загрузите NSOutlineView с данными, используя протокол NSOutlineDataSource
  2. Пользователь выбирает элемент (адаптер), который может добавлять дочерние элементы
  3. Пользователь нажимает кнопку «Добавить»
  4. Создается новый пустой представленный объект
  5. Новый представленный объект оборачивается в адаптер
  6. Недавно созданный адаптер добавляется впотомки выбранного адаптера
  7. Новое представление создается с использованием нового представленного объекта и отображается
  8. Выбранный (родительский) узел и его дочерние элементы перезагружаются в NSOutlineView
  9. .вновь созданная строка в NSOutlineView прокручивается для просмотра, который синхронизирует представление и выбор NSOutlineView

Так что здесь проблема.NSOutlineView не найдет вновь добавленный элемент, если вы используете метод rowForItem.Однако после перезагрузки я могу развернуть родительский узел и выбрать только что добавленный элемент, и все работает нормально.В попытке решить проблему, я программно развернул родительский узел (открывая новый элемент), затем попытался прокрутить до нового элемента, и он все еще не может найти строку.RowForItem возвращает -1.

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

Заранее спасибо, Роб

1 Ответ

1 голос
/ 25 ноября 2010

Решил мою собственную проблему ... наконец-то.

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

...