Odwoływanie się do zmiennych instancji AppDelegate

84

Mam projekt oparty na szablonie aplikacji opartej na nawigacji. W AppDelegate są metody -applicationDidFinishLoading:i -applicationWillTerminate:. W tych metodach ładuję i zapisuję dane aplikacji oraz przechowuję je w zmiennej instancji (w rzeczywistości jest to wykres obiektu).

Gdy aplikacja ładuje się, ładuje MainWindow.xib, który ma NavigationConroller, który z kolei ma RootViewController. Właściwość RootViewController nibNamewskazuje na RootView (moja rzeczywista klasa kontrolera).

W mojej klasie chciałbym odnieść się do obiektu, który utworzyłem w -applicationDidFinishLoading:metodzie, aby uzyskać do niego odniesienie.

Czy ktoś może mi powiedzieć, jak to zrobić? Wiem, jak odwoływać się do obiektów, które utworzyłem programowo, ale nie potrafię znaleźć sposobu, aby wrócić do wątku, biorąc pod uwagę, że środkowy krok został wykonany z pliku NIB.

Chris Hanson
źródło

Odpowiedzi:

204

W przypadku zmiennych (zwykle struktury danych modelu), do których potrzebuję dostępu w dowolnym miejscu aplikacji, zadeklaruj je w swojej klasie AppDelegate. Kiedy musisz się do tego odwołać:

YourAppDelegate *appDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate];
//and then access the variable by appDelegate.variable 
leonho
źródło
7
Głosowałem za to, ponieważ dodałeś obsadę, musisz rzucić AppDelegate na swój własny typ, abyś mógł zobaczyć własne ustawione właściwości. Możesz edytować, aby było to bardziej zrozumiałe, nie przesyłając do „AppDelegate” ...
Kendall Helmstetter Gelner
Czy istnieje sposób uzyskania dostępu do głównego kontrolera widoku bez odwoływania się do nazwy delegata aplikacji lub któregokolwiek z jej członków? (Chciałbym napisać jakiś przenośny kod, który potrzebuje głównego kontrolera widoku.)
SK9
SK9, każda aplikacja na iOS musi mieć appDelegate, więc kod będzie przenośny!
Daniel,
16

Jeśli rozumiem Twoje pytanie, chcesz odwołać się do zmiennych / właściwości członkowskich w obiekcie AppDelegate? Najprostszym sposobem jest użycie [[delegata UIApplication sharedApplication]] w celu zwrócenia odwołania do obiektu.

Jeśli masz właściwość o nazwie window, możesz to zrobić:

UIWindow   *mainWindow = [[[UIApplication sharedApplication] delegate] window];
//do something with mainWindow
Ben Gottlieb
źródło
11

Oto dobrze zdefiniowana przenośna alternatywa dla iOS 4.0 i nowszych:

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

lub w jednej linii

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

Nie zapomnij ustawić właściwości okna rootViewController(powiedzmy w IB), bo to zrobi jack.

SK9
źródło
2

Zdefiniuj makro i używaj go w dowolnym miejscu!

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

W moim kodzie: -

UIViewController *rootViewController = appDelegateShared.window.rootViewController;
tryKuldeepTanwar
źródło