Расширение всех элементов NSOutlineView, который загружает данные из источника данных - PullRequest
5 голосов
/ 13 апреля 2010

Прежде всего, я новичок в разработке какао, так что, наверное, я пытаюсь сделать это неправильно, но здесь идет речь:

У меня есть NSOutlineView, который загружает данные из NSOutlineViewDataSource реализации. Я хочу, чтобы все элементы были развернуты после их загрузки, но я не могу найти событие, инициированное после завершения загрузки данных, поэтому я могу отправить ему [outlineView expandItem: nil expandChildren: YES].

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

Ответы [ 4 ]

8 голосов
/ 14 января 2014

Обычно мне нравится делать что-то подобное внутри формы - awakeFromNib или любые другие обратные вызовы при запуске

dispatch_async(dispatch_get_main_queue(), ^{
    [self.outlineView expandItem:root expandChildren:YES];
});

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

3 голосов
/ 01 марта 2012

Лучшее решение, которое я придумал, - написать метод, который расширяет NSOutlineView после нулевой задержки.

- (void)windowDidLoad
{
    [super windowDidLoad];
    [self performSelector:@selector(expandSourceList) withObject:nil afterDelay:0.0];
}

- (IBAction)expandSourceList
{
    [mSourceListView expandItem:nil expandChildren:YES];
}
2 голосов
/ 14 апреля 2010

Я нашел ответ. Похоже, что реализация метода делегата -(void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item сделает свое дело:


-(void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item
{
    [outlineView expandItem:item];
}
1 голос
/ 13 апреля 2010

Вот как я обычно справляюсь с этим. Я предпочитаю показывать свое главное окно, а не позволять ему происходить автоматически. Это позволяет мне убедиться, что все мои элементы интерфейса настроены так, как я хочу, прежде чем я покажу пользователю окно. Кажется, ты тоже мог это сделать. Итак, сначала я снимаю флажок «Видимо при запуске» в конструкторе интерфейса для окна. Затем в классе делегатов моего приложения я использую этот метод, который является методом удаления NSApplication:

  • (недействительно) applicationDidFinishLaunching: (NSNotification *) aNotification

Там я настраиваю свои элементы интерфейса, потому что в этот момент я знаю, что все загружено. И тогда последняя строка этого метода будет: [myWindow makeKeyAndOrderFront: self] ;. Таким образом, вы узнаете, что ваше окно идеально, прежде чем ваш пользователь увидит окно. Поэтому я бы попробовал ваш метод там.

...