La expansión de todos los elementos de un NSOutlineView que carga datos desde una fuente de datos

StackOverflow https://stackoverflow.com/questions/2631207

  •  26-09-2019
  •  | 
  •  

Pregunta

En primer lugar soy nuevo en el desarrollo de cacao así que supongo que probablemente estoy tratando de hacer esto a mal, pero aquí va:

Tengo un NSOutlineView la que carga los datos de una aplicación NSOutlineViewDataSource. Quiero que todos los elementos que se expandieron después de haberse cargado, pero me parece que no puede encontrar un evento disparado cuando los datos han terminado de cargar, así que puedo enviar un [outlineView expandItem: nil expandChildren: YES] a él.

Me miraba en el protocolo de NSOutlineViewDelegate pero fue incapaz de encontrar un lugar adecuado para esta llamada. ¿Cuál sería el mejor enfoque para este problema?

¿Fue útil?

Solución

Normalmente me gusta hacer algo como esto en la parte interna - awakeFromNib o cualquier otro devoluciones de llamada de inicio

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

Esto poner en cola el bloque de ejecución al final del ciclo actual en el runloop, por lo tanto, se ejecutará después de todo la inicialización ha tenido lugar. No hay necesidad de configurar cualquier retraso artificial.

Otros consejos

La mejor solución que he llegado con es escribir un método que amplía el NSOutlineView después de una demora de cero.

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

- (IBAction)expandSourceList
{
    [mSourceListView expandItem:nil expandChildren:YES];
}

He encontrado la respuesta. Parece que la implementación del método delegado -(void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item hará el truco:


-(void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item
{
    [outlineView expandItem:item];
}

Así es como normalmente me encargo de esto. Me gusta mostrar mi ventana principal de mi mismo en lugar de dejar que suceda de forma automática. Esto me permite asegurarse de que todos mis elementos de la interfaz están configurados como quiero antes de mostrar al usuario la ventana. Parece que podría hacer esto también. Así que primero desactive la casilla "visible en el lanzamiento" en constructor de interfaces para la ventana. A continuación, en la clase de delegado de mi solicitud utilizo este método que es un método de deleate NSApplication:

  • (void) applicationDidFinishLaunching: (NSNotification *) aNotification

no puedo configurar mi interfaz de artículos porque en ese momento yo sé todo está cargado. Y entonces la última línea de este método sería: [myWindow makeKeyAndOrderFront: auto] ;. De esta manera usted sabe que su ventana es perfecto antes de su usuario ve la ventana. Así que me gustaría probar su método allí.

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