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.

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 

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

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).


2

Definieren Sie ein Makro und verwenden Sie es überall!

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

In meinem Code: -

UIViewController *rootViewController = appDelegateShared.window.rootViewController;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.