2010-04-13 5 views
5

Zunächst einmal ich Kakao Entwicklung neuer bin so ich denke, ich bin wahrscheinlich das der falsche Weg versuchen zu tun, aber hier geht:alle Elemente eines NSOutlineView erweitern, dass lädt Daten aus einer Datenquelle

I haben Sie eine NSOutlineView, die die Daten von einer NSOutlineViewDataSource Implementierung lädt. Ich möchte, dass alle Elemente nach dem Laden erweitert werden, aber ich kann anscheinend kein Ereignis finden, das ausgelöst wird, wenn die Daten geladen sind, sodass ich eine [outlineView expandItem: nil expandChildren: YES] senden kann.

Ich schaute in das Protokoll NSOutlineViewDelegate, aber ich konnte keinen geeigneten Ort für diesen Anruf finden. Was wäre der beste Ansatz für dieses Problem?

Antwort

1

So gehe ich normalerweise damit um. Ich möchte mein Hauptfenster lieber selbst zeigen, als es automatisch geschehen zu lassen. Dadurch kann ich sicherstellen, dass alle meine Benutzeroberflächenelemente so eingerichtet sind, wie ich es möchte, bevor ich dem Benutzer das Fenster zeige. Es scheint, du könntest das auch tun. Also deaktiviere ich zuerst "Sichtbar beim Start" im Interface Builder für das Fenster. Dann in Delegaten Klasse meiner Anwendung Ich benutze diese Methode, die ein deleate Verfahren von NSApplication ist:

  • (void) applicationDidFinishLaunching: (NSNotification *) aNotification

Dort ich mein Setup Interface Elemente, weil an, dass Punkt Ich weiß, dass alles geladen ist. Und dann wäre die letzte Zeile dieser Methode: [myWindow makeKeyAndOrderFront: self]; Auf diese Weise wissen Sie, dass Ihr Fenster perfekt ist, bevor Ihr Benutzer das Fenster sieht. Also ich würde deine Methode dort ausprobieren.

+0

danke, aber das ist keine Lösung für mich, da die Übersichtsansicht in einem Fenster ist, das geöffnet wird, wenn ein Benutzer auf eine Schaltfläche klickt, und die Daten geladen werden, wenn das Bedienfeld angezeigt wird, nicht wenn die Anwendung – matei

1

Ich fand die Antwort. Es scheint, dass die Delegatmethode Umsetzung -(void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item den Trick:


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

später gestartet wird edit: das ist keine gute antwort, es scheint, die letzten artikel in der umrissansicht zu vermasseln und sie nicht zu zeigen, also würde jede hilfe geschätzt werden – matei

3

Die beste Lösung, die ich habe kommen mit ist es, ein Verfahren zu schreiben, die die NSOutlineView nach einer Verzögerung von Null erweitert.

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

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

Danke für die verwendung des 'windowDidLoad': das scheint ein guter platz zu sein diese Art von Einrichtung. Aber ich habe übrigens festgestellt, dass ich die Verzögerung nicht verwenden muss, zumindest was ich versuche zu tun: Ich rufe '-expandItem:' direkt von 'windowDidLoad', und so weit das scheint zu funktionieren. Vielleicht aufgrund eines der folgenden: Ich bin auf 10.9.3; Ich erweitere nur bestimmte Zeilen, also stelle ich bestimmte Elemente für "-expandItem" bereit: "statt" nil "...? – Ashley

6

Normalerweise mag ich so etwas wie dieses im Inneren Form tun - awakeFromNib oder andere Start Rückrufe

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

Dies wird den Ausführungsblock am Ende des aktuellen Zyklus in der Runloop, so einzureihen, Es wird ausgeführt, nachdem alle Initialisierung stattgefunden hat. Es besteht keine Notwendigkeit, künstliche Verzögerungen einzustellen.

+0

Nicht sicher, warum dies abgelehnt wurde. Dies funktionierte für mich, wenn andere Lösungen fehlschlugen. Vielen Dank! –

+0

Beste Antwort! :) Das funktioniert unabhängig vom Kontext. – Kappe