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

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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top