Как установить выбор по умолчанию для NSTreeController при запуске? - PullRequest
0 голосов
/ 25 апреля 2010

Фон

Я создал список источников (аналогично iTunes и др.) В моем приложении Cocoa.

  • У меня есть NSOutlineView со значением столбец привязан к ключевой путь NSTreeController.

  • Доступ к NSTreeController Объекты JGSourceListNode в ядре Хранилище данных.

  • У меня есть три подкласса JGSourceListNode - JGProjectNode, JGGroupNode и JGFolderNode.

  • Я выбралIndexPaths в NSTreeController, привязанный к NSArray с именем selectedIndexPaths в моем делегате приложения.

При запуске я ищу групповые узлы и, если они не найдены в основном хранилище данных, я создаю их:

if ([allGroupNodes count] == 0) {
    JGGroupNode *rootTrainingNode = [JGGroupNode insertInManagedObjectContext:context];
    [rootTrainingNode setNodeName:@"TRAIN"];

    JGProjectNode *childUntrainedNode = [JGProjectNode insertInManagedObjectContext:context];
    [childUntrainedNode setParent:rootTrainingNode];
    [childUntrainedNode setNodeName:@"Untrained"];

    JGGroupNode *rootBrowsingNode = [JGGroupNode insertInManagedObjectContext:context];
    [rootBrowsingNode setNodeName:@"BROWSE"];

    JGFolderNode *childFolder = [JGFolderNode insertInManagedObjectContext:context];
    [childFolder setNodeName:@"Folder"];
    [childFolder setParent:rootBrowsingNode];

    [context save:nil];
}

Что я хочу

Когда я запускаю приложение, я хочу, чтобы обе группы верхнего уровня были расширены и «Необученные» были выделены, как показано:

Мое окно http://synapticmishap.co.uk/Window.jpeg

Проблема

Я поместил следующий код в метод applicationDidFinishLaunching: делегата приложения:

[sourceListOutlineView expandItem:[sourceListOutlineView itemAtRow:0]];
[sourceListOutlineView expandItem:[sourceListOutlineView itemAtRow:2]];
NSIndexPath *rootIndexPath = [NSIndexPath indexPathWithIndex:0];
NSIndexPath *childIndexPath = [rootIndexPath indexPathByAddingIndex:0];
[self setSelectedIndexPaths:[NSArray arrayWithObject:childIndexPath]];

но вид структуры, похоже, еще не подготовлен, поэтому этот код ничего не делает.

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

Вопрос

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

Как бы я сделал это элегантно?

1 Ответ

1 голос
/ 25 апреля 2010

Элегантно? Это не элегантно, но я так делаю. Я просто делаю это вручную. При выходе из приложения я записываю это значение в пользовательские значения по умолчанию:

lastSelectedRow = [outlineView selectedRow]

Затем при запуске приложения я запускаю это приложение, которое завершило запуск:

[self performSelector:@selector(selectLastNoteOrCreateDefaultNote) withObject:nil afterDelay:1];

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

[outlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:lastSelectedRow] byExtendingSelection:NO];

Это работает, но от меня тоже приветствуются лучшие (более элегантные) решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...