2010-04-13 10 views
5

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:expansión de todos los elementos de un NSOutlineView que carga datos desde una fuente de datos

I tiene un NSOutlineView que carga los datos de una implementación NSOutlineViewDataSource. Quiero que todos los elementos se expandan después de que se carguen, pero parece que no puedo encontrar un evento disparado cuando los datos han terminado de cargarse, así que puedo enviarle un [outlineView expandItem: nil expandChildren: YES].

Miré en el protocolo NSOutlineViewDelegate pero no pude encontrar un lugar adecuado para esta llamada. ¿Cuál sería el mejor enfoque para este problema?

Respuesta

1

Así es como normalmente manejo esto. Me gusta mostrar mi ventana principal en lugar de dejar que suceda automáticamente. Esto me permite asegurarme de que todos los elementos de mi interfaz estén configurados como quiero antes de mostrarle al usuario la ventana. Parece que podrías hacer esto también. Así que primero desactivo "Visible en el lanzamiento" en el constructor de interfaz para la ventana. A continuación, en la clase de delegado de mi solicitud utilizo este método que es un método deleate de NSApplication:

  • (void) applicationDidFinishLaunching: (NSNotification *) aNotification

En no puedo configurar mis elementos de la interfaz porque en ese punto que sé que todo está cargado. Y luego la última línea de ese método sería: [myWindow makeKeyAndOrderFront: self] ;. De esta manera sabrá que su ventana es perfecta antes de que su usuario vea la ventana. Entonces probaría su método allí.

+0

gracias, pero esta no es una solución para mí ya que la vista general está en un panel que se abre cuando un usuario hace clic en un botón y parece que los datos se cargan cuando se muestra el panel, no cuando se inicia la aplicación – matei

1

Encontré 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]; 
} 
+0

posterior editar: esta no es una buena respuesta, parece arruinarse en los últimos elementos en la vista de contorno y no mostrarlos, por lo que cualquier ayuda sería apreciada – matei

3

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]; 
} 
+0

Gracias por sugerir el uso de 'windowDidLoad': este parece un buen lugar para poner este tipo de configuración Pero, por cierto, he descubierto que no necesito usar el retraso, al menos para lo que estoy tratando de hacer: llamo '-expandItem:' directamente desde 'windowDidLoad', y hasta ahora , esto parece funcionar Quizás debido a uno de los siguientes: estoy en 10.9.3; Solo estoy expandiendo ciertas filas, por lo que estoy proporcionando elementos específicos para '-expandItem:' en lugar de 'nil' ...? – Ashley

6

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 que haya tenido lugar toda la inicialización. No hay necesidad de establecer ningún retraso artificial.

+0

No estoy seguro de por qué esto fue downvoted. Esto funcionó para mí cuando fallaron otras soluciones que pude encontrar. ¡Gracias! –

+0

¡La mejor respuesta! :) este funciona independientemente del contexto. – Kappe

Cuestiones relacionadas