2008-10-23 16 views
83

Ich habe ein Projekt, das auf der Vorlage für navigationsbasierte Anwendungen basiert. Im AppDelegate sind die Methoden -applicationDidFinishLoading: und -applicationWillTerminate:. In diesen Methoden lade und speichere ich die Anwendungsdaten und speichere sie in einer Instanzvariablen (es ist eigentlich ein Objektgraph).AppDelegate-Instanzvariablen referenzieren

Wenn die Anwendung geladen wird, wird MainWindow.xib geladen, das über einen NavigationConroller verfügt, der wiederum über einen RootViewController verfügt. Die RootViewController nibName Eigenschaft zeigt auf RootView (meine tatsächliche Controller-Klasse).

In meiner Klasse möchte ich auf das Objekt verweisen, das ich in der -applicationDidFinishLoading: Methode erstellt habe, so dass ich einen Verweis darauf erhalten kann.

Kann mir jemand sagen, wie man das macht? Ich weiß, wie ich zwischen Objekten, die ich programmatisch erstellt habe, referenzieren kann, aber ich kann nicht herausfinden, wie ich den Weg zurückfädle, da der mittlere Schritt aus der NIB-Datei heraus erfolgte.

Antwort

15

Wenn ich Ihre Frage verstehe, möchten Sie Mitglied Variablen/Eigenschaften in Ihrem AppDelegate-Objekt verweisen? Der einfachste Weg besteht darin, [[UIApplication sharedApplication] -Delegate] zu verwenden, um einen Verweis auf Ihr Objekt zurückzugeben.

Wenn Sie eine Eigenschaft namens Fenster haben, können Sie dies tun:

UIWindow *mainWindow = [[[UIApplication sharedApplication] delegate] window]; 
//do something with mainWindow 
203

Für Variablen (in der Regel die Modelldatenstruktur), die ich brauche es in der App überall zugreifen zu können, erklären sie in Ihrem AppDelegate-Klasse Wenn Sie darauf verweisen müssen:

YourAppDelegate *appDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate]; 
//and then access the variable by appDelegate.variable 
+7

ich dieses gestimmt, weil Sie die Besetzung hinzugefügt, müssen Sie AppDelegate werfen Ihr eigener Typ, damit Sie Ihre eigenen Eigenschaften sehen können. Sie könnten dies bearbeiten, um dies deutlicher zu machen, indem Sie nicht auf "AppDelegate" werfen, obwohl ... –

+0

Gibt es eine Möglichkeit, auf den Stammansicht-Controller zuzugreifen, ohne auf den Namen des App-Delegierten oder eines seiner Mitglieder Bezug zu nehmen? (Ich möchte einen portablen Code schreiben, der den Root-View-Controller benötigt.) – SK9

+0

SK9, jede iOS-App muss eine AppDelegate haben, damit der Code portabel ist! – Daniel

11

Hier ist eine gut definierte tragbare Alternative für iOS4.0 und bis:

UIApplication *myApplication = [UIApplication sharedApplication]; 
UIWindow *mainWindow = [myApplication keyWindow]; 
UIViewController *rootViewController = [mainWindow rootViewController]; 

oder, in einer Zeile,

UIViewController *rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController]; 

Do not vergessen Sie, die Eigenschaft des Fensters zu setzen (sagen wir in IB) oder dies wird Jack tun.

1

definiere ich ein Makro und es wie folgt verwendet werden: -

#define appDelegateShared ((AppDelegate *)[UIApplication sharedApplication].delegate) 

In My Code: -

appDelegateShared.myVariable=anotherVariable;