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