NSOutlineView — автоматическое развертывание всех узлов

У меня есть NSOutlineView, связанный с NSTreeController (если это имеет значение), и я хотел бы расширить каждый узел в моем -awakeFromNib().

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

Спасибо,

Богатый


person Rich Catalano    schedule 06.02.2009    source источник


Ответы (2)


Я хотел бы расширить каждый узел в моем -awakeFromNib().

Начиная с Mac OS X 10.5, [outlineView expandItem:nil expandChildren:YES].

В предыдущих версиях Mac OS X вам нужно было выполнить итерацию от 0 до количества строк, получить элемент для каждой строки с помощью [outlineView itemAtRow:row] и сохранить эти элементы в массиве, затем выполнить итерацию массива и передать каждый элемент в expandItem:expandChildren: метод. (Вы не можете смешивать два цикла, потому что расширение элемента и всех его потомков изменит индексы строк его последующих братьев и сестер; поэтому вы должны сначала собрать все элементы верхнего уровня, а затем расширить их, как только у вас есть все они. )

Я также хотел бы программно выбрать первый дочерний элемент первого узла одновременно.

Сразу после вышесказанного это будет строка 1.

Представление схемы — это своего рода табличное представление, поэтому вы будете использовать один из методов NSTableView: [outlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:1] byExtendingSelection:NO].

person Peter Hosey    schedule 06.02.2009
comment
Отлично, спасибо. Почему передача nil работает? Я пробовал это сообщение практически со всеми объектами, которые только мог придумать… - person Rich Catalano; 06.02.2009
comment
Как поясняется в документации NSOutlineView, присваивая ему значение nil, поскольку элемент указывает ему развернуть все корневые элементы. - person Peter Hosey; 06.02.2009
comment
Также по теме: не пейте слишком много вина при кодировании и не забудьте подключить выход к NSOutlineView, как я сделал сегодня. ;) - person Rafael Bugajewski; 25.01.2012
comment
По-видимому, добавление этого вызова после перезагрузки данных не сработало. Любые обходные пути? - person adib; 09.10.2012
comment
Проблема, когда вы хотите программно расширить некоторые элементы в NSOutlineView при запуске приложения, заключается в том, что NSTreeController подготавливает свое содержимое после вызова awakeFromNib на вашем контроллере. Я нашел решение здесь: simplyhacking.com/ ( Вы должны отслеживать путь к содержимому вашего NSTreeController и расширять элемент, как только данные будут загружены. Не забудьте удалить наблюдателя, когда закончите.) - person Daniel; 15.02.2013

Если вы загружаете из источника данных,

dispatch_async(dispatch_get_main_queue(), ^{
  [self.outlineView expandItem:root expandChildren:YES];
});
person Kyle Browning    schedule 23.10.2014