6 Stimmen

Aufklappen aller Elemente einer NSOutlineView, die Daten aus einer Datenquelle lädt

Zunächst einmal bin ich neu in der Kakao-Entwicklung, also nehme ich an, dass ich wahrscheinlich versuche, dies auf die falsche Art und Weise zu tun, aber hier geht:

J'ai un NSOutlineView der die Daten aus einer NSOutlineViewDataSource Umsetzung. Ich möchte, dass alle Elemente erweitert werden, nachdem sie geladen wurden, aber ich kann nicht scheinen, um ein Ereignis zu finden, das ausgelöst wird, wenn die Daten fertig geladen sind, so dass ich eine [outlineView expandItem: nil expandChildren: YES] dazu.

Ich habe mir die NSOutlineViewDelegate Protokoll, aber ich konnte keinen geeigneten Ort für diesen Aufruf finden. Was wäre der beste Ansatz für dieses Problem?

10voto

Merlevede Punkte 8078

Normalerweise mag ich so etwas wie diese innerhalb der Form zu tun - awakeFromNib oder jede andere Startaufrufe

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

Dadurch wird der Ausführungsblock am Ende des aktuellen Zyklus in die Warteschlange gestellt, d.h. er wird ausgeführt, nachdem alle Initialisierungen stattgefunden haben. Es besteht keine Notwendigkeit, eine künstliche Verzögerung einzustellen.

3voto

gerdemb Punkte 10825

Die beste Lösung, die ich gefunden habe, ist eine Methode zu schreiben, die die NSOutlineView nach einer Verzögerung von Null.

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

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

2voto

matei Punkte 8195

Ich habe die Antwort gefunden. Es scheint, dass die Implementierung der Delegate-Methode -(void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item reicht aus:

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

1voto

regulus6633 Punkte 18355

Normalerweise gehe ich folgendermaßen vor. Ich zeige mein Hauptfenster lieber selbst an, als es automatisch geschehen zu lassen. So kann ich sicherstellen, dass alle Elemente der Benutzeroberfläche wie gewünscht eingerichtet sind, bevor ich dem Benutzer das Fenster zeige. Es scheint, als könnten Sie das auch tun. Zuerst deaktiviere ich also im Interface Builder die Option "Sichtbar beim Start" für das Fenster. Dann verwende ich in der Delegatenklasse meiner Anwendung diese Methode, die eine deleate-Methode von NSApplication:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification

Dort richte ich meine Schnittstellenelemente ein, denn zu diesem Zeitpunkt weiß ich, dass alles geladen ist. Und die letzte Zeile dieser Methode wäre dann: [myWindow makeKeyAndOrderFront:self];. Auf diese Weise wissen Sie, dass Ihr Fenster perfekt ist, bevor der Benutzer das Fenster sieht. Ich würde also Ihre Methode dort ausprobieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X