2008-10-23 5 views
83

J'ai un projet basé sur le modèle Application basée sur la navigation. Dans l'AppDelegate, les méthodes -applicationDidFinishLoading: et -applicationWillTerminate: sont utilisées. Dans ces méthodes, je charge et enregistre les données de l'application, et les stocke dans une variable d'instance (il s'agit en fait d'un graphe d'objets). Lorsque l'application charge, elle charge MainWindow.xib, qui a un NavigationConroller, qui à son tour a un RootViewController. La propriété RootViewController nibName pointe vers RootView (ma classe de contrôleurs actuelle).Référencement des variables d'instance AppDelegate

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

Quelqu'un peut-il me dire comment faire cela? Je sais comment référencer entre les objets que j'ai créés par programmation, mais je n'arrive pas à comprendre comment revenir en arrière, étant donné que l'étape intermédiaire a été faite depuis le fichier NIB.

Répondre

15

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

Si vous avez une fenêtre appelée propriété, vous pouvez le faire:

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

Pour les variables (généralement la structure de données de modèle) que je dois y avoir accès partout dans l'application, les déclarer dans votre Classe AppDelegate. Lorsque vous devez référencer:

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

J'ai voté celui-ci parce que vous avez ajouté le casting, vous avez besoin de jeter AppDelegate à votre propre type de sorte que vous pouvez voir vos propres propriétés que vous définissez. Vous pourriez éditer pour rendre ceci plus clair en ne coulant pas à "AppDelegate" cependant ... –

+0

Y at-il un moyen d'accéder au contrôleur de vue racine sans faire référence au nom du délégué de l'application ou à aucun de ses membres? (Je voudrais écrire un code portable qui nécessite le contrôleur de vue racine.) – SK9

+0

SK9, chaque application iOS doit avoir un appDelegate, donc le code sera portable! – Daniel

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, dans une ligne,

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

Ne pas oubliez de définir la propriété rootViewController de la fenêtre (disons dans IB) ou cela fera jack.

1

Je définir une macro et l'utiliser comme ceci: -

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

Mon code: -

appDelegateShared.myVariable=anotherVariable; 
Questions connexes