Verweisen auf AppDelegate-Instanzvariablen

84

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

Wenn die Anwendung geladen wird, wird MainWindow.xib geladen, das über einen NavigationConroller und einen RootViewController verfügt. Die RootViewController- nibNameEigenschaft verweist auf RootView (meine eigentliche Controller-Klasse).

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

Kann mir jemand sagen, wie das geht? Ich weiß, wie man zwischen Objekten referenziert, die ich programmgesteuert erstellt habe, aber ich kann nicht herausfinden, wie ich mich zurückfädle, da der mittlere Schritt aus der NIB-Datei heraus ausgeführt wurde.

Chris Hanson
quelle

Antworten:

204

Deklarieren Sie Variablen (normalerweise die Modelldatenstruktur), auf die ich irgendwo in der App zugreifen muss, in Ihrer AppDelegate-Klasse. Wenn Sie darauf verweisen müssen:

YourAppDelegate *appDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate];
//and then access the variable by appDelegate.variable 
leonho
quelle
7
Ich habe diese Option gewählt, weil Sie die Besetzung hinzugefügt haben. Sie müssen AppDelegate in Ihren eigenen Typ umwandeln, damit Sie Ihre eigenen Eigenschaften sehen können, die Sie festgelegt haben. Sie können dies bearbeiten, um dies klarer zu machen, indem Sie nicht auf "AppDelegate" übertragen ...
Kendall Helmstetter Gelner
Gibt es eine Möglichkeit, auf den Root-View-Controller zuzugreifen, ohne auf den Namen des App-Delegaten oder eines seiner Mitglieder zu verweisen? (Ich möchte einen tragbaren Code schreiben, der den Root View Controller benötigt.)
SK9
SK9, jede iOS-App muss ein appDelegate haben, damit der Code portabel ist!
Daniel
16

Wenn ich Ihre Frage verstehe, möchten Sie auf Mitgliedsvariablen / -eigenschaften in Ihrem AppDelegate-Objekt verweisen? Am einfachsten ist es, [[UIApplication sharedApplication] delegate] zu verwenden, um einen Verweis auf Ihr Objekt zurückzugeben.

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

UIWindow   *mainWindow = [[[UIApplication sharedApplication] delegate] window];
//do something with mainWindow
Ben Gottlieb
quelle
11

Hier ist eine gut definierte tragbare Alternative für iOS 4.0 und höher:

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

oder in einer Zeile

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

Vergessen Sie nicht, die rootViewControllerEigenschaft des Fensters festzulegen (z. B. in IB).

SK9
quelle
2

Definieren Sie ein Makro und verwenden Sie es überall!

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

In meinem Code: -

UIViewController *rootViewController = appDelegateShared.window.rootViewController;
tryKuldeepTanwar
quelle