¿Cómo se configura la selección predeterminada para NSTreeController en el arranque?
-
01-10-2019 - |
Pregunta
El fondo
He construido una lista de fuentes (similar a iTunes et al.) Cacao en mi aplicación.
-
Tengo una NSOutlineView, con Valor columna enlazada a arrangedObjects.name ruta de la clave de una NSTreeController.
-
El NSTreeController accesos entidades JGSourceListNode en un Core almacén de datos.
-
Tengo tres subclases de JGSourceListNode - JGProjectNode, JGGroupNode y JGFolderNode.
-
Tengo selectedIndexPaths en NSTreeController enlazados a un NSArray llama selectedIndexPaths en mi aplicación Delegado.
En el arranque, busco nodos de grupo y si no se encuentran en los datos del almacén de núcleo las creo:
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];
}
Lo que quiero
Cuando comienzo a la aplicación, quiero que ambos grupos de nivel superior para expandir y "inexperto" ser destacado como se muestra:
Mi Ventana http://synapticmishap.co.uk/Window.jpeg
El problema
Me puso el código siguiente en el método applicationDidFinishLaunching:
del delegado de la aplicación:
[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]];
pero la vista de esquema parece no haber sido preparado, sin embargo, lo que este código no hace nada.
Lo ideal sería que, con el tiempo quiero salvar la última selección había hecho el usuario y restaurar esta en un reinicio.
La pregunta ??strong>
Estoy seguro de que es posible el uso de algunos MVA loco para observar cuando el NSTreeController o NSOutlineView se rellena a continuación, se expanden los elementos y cambiar la selección, pero que se siente torpe y demasiado a un trabajo alrededor.
¿Cómo voy a hacer esto con elegancia?
Solución
Elegantemente? Esto no es elegante, pero es como lo estoy haciendo. Sólo lo hago manualmente. En aplicación dejé que escribo este valor a los valores predeterminados de usuario:
lastSelectedRow = [outlineView selectedRow]
A continuación, en el lanzamiento de aplicaciones corro en esta aplicación lo hizo el lanzamiento final:
[self performSelector:@selector(selectLastNoteOrCreateDefaultNote) withObject:nil afterDelay:1];
Aviso que sólo tiene que utilizar un retraso porque me di cuenta de la misma a medida que que "la vista de esquema parece no haber sido preparado todavía". Luego, en ese selector utilizo esto.
[outlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:lastSelectedRow] byExtendingSelection:NO];
Funciona, pero mejor (más elegantes soluciones) son bienvenidos a mí también.