0

ФоноваяКак установить настройку по умолчанию для NSTreeController при запуске?

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

  • У меня есть NSOutlineView с Value столбца, связанного с arrangedObjects.name ключевой путь к 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]; 
} 

Что я Хочу

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

My Window 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]]; 

но контурный вид, кажется, не были подготовлены еще, так что этот код ничего не делает ,

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

Вопрос

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

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

ответ

1

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

lastSelectedRow = [outlineView selectedRow] 

Тогда при запуске приложения я запускаю это приложение сделал закончить запуск:

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

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

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

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

+0

Вероятно, вы должны установить задержку на «0», которая отправит сообщение на следующей итерации цикла событий без видимой «задержки». –

+0

Эй, Роб, это действительно работало. Я удивлен, но я думаю, мне просто нужно было ждать следующего цикла событий, как вы упомянули ... и, конечно, задержка 0 лучше/быстрее. Благодарю. – regulus6633