Référencement des variables d'instance AppDelegate

84

J'ai un projet basé sur le modèle d'application basée sur la navigation. Dans l'AppDelegate se trouvent les méthodes -applicationDidFinishLoading:et -applicationWillTerminate:. Dans ces méthodes, je charge et enregistre les données de l'application, et je les stocke dans une variable d'instance (il s'agit en fait d'un objet-graphe).

Lorsque l'application se charge, elle charge MainWindow.xib, qui a un NavigationConroller, qui à son tour a un RootViewController. La nibNamepropriété RootViewController pointe vers RootView (ma classe de contrôleur réelle).

Dans ma classe, je souhaite faire référence à l'objet que j'ai créé dans la -applicationDidFinishLoading:méthode, afin de pouvoir y faire référence.

Quelqu'un peut-il me dire comment faire cela? Je sais comment faire référence entre des objets que j'ai créés par programme, mais je n'arrive pas à comprendre pour revenir en arrière, étant donné que l'étape du milieu a été effectuée à partir du fichier NIB.

Chris Hanson
la source

Réponses:

204

Pour les variables (généralement la structure de données du modèle) dont j'ai besoin pour y accéder n'importe où dans l'application, déclarez-les dans votre classe AppDelegate. Lorsque vous avez besoin de le référencer:

YourAppDelegate *appDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate];
//and then access the variable by appDelegate.variable 
Leonho
la source
7
J'ai voté celui-ci parce que vous avez ajouté le casting, vous devez cast AppDelegate dans votre propre type afin que vous puissiez voir vos propres propriétés que vous avez définies. Vous pouvez modifier pour rendre cela plus clair en ne castant pas vers "AppDelegate" si ...
Kendall Helmstetter Gelner
Existe-t-il un moyen d'accéder au contrôleur de vue racine sans faire référence au nom du délégué d'application ou à l'un de ses membres? (Je voudrais écrire un code portable qui nécessite le contrôleur de vue racine.)
SK9
SK9, chaque application iOS doit avoir un appDelegate, le code sera donc portable!
Daniel
16

Si je comprends votre question, vous souhaitez référencer des variables / propriétés de membre dans votre objet AppDelegate? Le moyen le plus simple consiste à utiliser [[UIApplication sharedApplication] delegate] pour renvoyer une référence à votre objet.

Si vous avez une propriété appelée window, vous pouvez le faire:

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

Voici une alternative portable bien définie pour iOS4.0 et plus:

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

ou, sur une seule ligne,

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

N'oubliez pas de définir la rootViewControllerpropriété de la fenêtre (disons dans IB) ou cela fera jack.

SK9
la source
2

Définissez une macro et utilisez-la n'importe où!

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

Dans mon code: -

UIViewController *rootViewController = appDelegateShared.window.rootViewController;
essayezKuldeepTanwar
la source