2010-12-27 2 views
0

Die Methode applicationDidFinishLaunching: wird im Anwendungsdelegaten aufgerufen, bevor eine Core Data-Entität in eine Tabelle geladen wird, die mit dem Tool "Core Data Entity" in der Interface Builder-Bibliothek erstellt wurde.Wie sende ich eine Nachricht beim Start der Anwendung, unmittelbar nachdem eine Kerndateneinheit geladen wurde?

Ich habe eine benutzerdefinierte Ansicht (mit Controller), die Daten basierend auf der ausgewählten Core Data Entity darstellt. Wenn ich meine Anwendung starte, wird der oberste Eintrag in der Tabelle der Core Data-Entitäten automatisch ausgewählt, und andere an Eigenschaften dieser Entität gebundene Textfelder werden mit den korrekten Daten gefüllt. Ich muss eine Nachricht an den benutzerdefinierten Ansichtscontroller senden, um die benutzerdefinierte Ansicht neu zu zeichnen, nachdem die Daten beim Anwendungsstart geladen wurden.

Wo sollte ich den Code zum Senden der Nachricht an die benutzerdefinierte Ansicht Controller? Gibt es eine Delegate-Methode ähnlich applicationDidFinishLaunching:, die eine Benachrichtigung erhält, nachdem die Kerndatenentität beim Start geladen wurde?

Antwort

2

Es hat eine Weile gedauert, das herauszufinden, da ich relativ neu in Cocoa bin. Die entsprechende Dokumentation ist hier: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdBindings.html

If the "automatically prepares content" flag (see, for example, setAutomaticallyPreparesContent:) is set for a controller, the controller's initial content is fetched from its managed object context using the controller's current fetch predicate. It is important to note that the controller's fetch is executed as a delayed operation performed after its managed object context is set (by nib loading)—this therefore happens after awakeFromNib and windowControllerDidLoadNib:. This can create a problem if you want to perform an operation with the contents of an object controller in either of these methods, since the controller's content is nil. You can work around this by executing the fetch "manually" with fetchWithRequest:merge:error:. You pass nil as the fetch request argument to use the default request, as illustrated in the following code fragment.

Ich habe einen IBOutlet meiner NSArrayController innerhalb der App delegieren und verbunden es im Interface Builder. Ich habe dann die folgenden das Verfahren applicationDidFinishLoading: auf der Grundlage der Dokumentation in dem oben genannten Link:

-(void)applicationDidFinishLaunching:(NSNotification *) aNotification { 

    NSError *error = nil; 
    BOOL ok = [myArrayController fetchWithRequest:nil merge:NO error:&error]; 

    if (ok) { 
     [myCustomViewController redrawMyCustomView]; 
    } 
} 

Nun, wenn ich die Anwendung starte, füllen die Daten auf den Tisch und die Aussicht ist automatisch neu gezeichnet mit den ausgewählten Daten.