2009-05-12 5 views
15

J'ai un AppDelegate qui a 3 vues. J'ajouter les troisRéférencement Méthodes AppDelegate - iphone

[window addSubview:gameViewController.view]; 
[window addSubview:viewSettings.view]; 
[window addSubview:viewController.view]; 
[window makeKeyAndVisible]; 

Dans le délégué de l'application, j'ai quelques Methodes pour échanger des vues en appelant

[window bringSubviewToFront:gameViewController.view]; 

Quand je suis à l'intérieur viewController, j'utilise

pinkAppDelegate *appDelegate= (pinkAppDelegate *)[[UIApplication sharedApplication] delegate]; 

[appDelegate switchToSettings]; 

pour changer mon sous-vues ... jusqu'ici tout va bien. MAIS, quand je suis à mon avisSetting UIViewController, et faites le même appel appDelegate, il bloque, comme il ne comprend pas comment appeler la méthode appDelegate.

J'ai toutes mes vues accroché dans mon mainwindow xib, mais ne peut pas comprendre pourquoi je ne peux pas traverser les méthodes dans la principale appdelegate

+0

-vous Maen que '[[UIApplication sharedApplication] déléguer]; 'échoue? ou que vous ne pouvez pas lui envoyer un message 'switchToSettings'? Est-ce l'exécution ou la compilation? –

+0

temps d'exécution ... je ne peux pas envoyer le message. Je POUVE d'une vue ... mais pas d'une autre ... – jalo

Répondre

28

intérieur viewController, vous configurez une variable locale appelé appDelegate qui pointe vers le délégué de votre application. C'est ce que cette ligne fait:

pinkAppDelegate *appDelegate= (pinkAppDelegate *)[[UIApplication sharedApplication] delegate]; 

Cette variable est locale à viewController, donc vous ne pouvez pas l'utiliser dans l'écran des paramètres de commande. Vous devez configurer une autre variable ici.

Vous pouvez également utiliser ce joli #define dans votre application. (Vous aurez besoin de le mettre dans un fichier d'en-tête .h que vous incluez dans tous les fichiers dans votre projet.)

#define myAppDelegate (MyAppDelegate *)[[UIApplication sharedApplication] delegate] 

Ensuite, vous pouvez faire ce qui suit partout:

[myAppDelegate doSomething]; 
+0

Pourquoi ne pas téléphoner directement?: [[Délégué UIApplication sharedApplicaion] doSomething] – stefanB

+0

En dehors du fait que UIApplication n'aura pas ces méthodes personnalisées de toute façon ... – stefanB

+0

@stefanB tout ce [[UIApplication delegate bla bla partagé est moche et cette solution permet d'éviter les erreurs comme jalo a. –

1

Jane réponse a une faute de frappe dedans.

Utilisez la ligne suivante dans un fichier d'en-tête (par exemple defines.h) que vous importez dans toutes les classes:

#define myAppDelegate [[UIApplication sharedApplication] delegate] 

Vous pouvez également utiliser la ligne dans un fichier d'en-tête de préfixe - c'est un moyen facile de avoir accès à cela partout.

puis dans toute méthode que vous pouvez utiliser une des opérations suivantes:

[myAppDelegate doSomething]; 
myAppDelegate.property=value; 
myAppDelegate.childClassOfMyAppDelegate.property=value; 
[myAppDelegate.ChildOfMyAppDelegate doSomething]; 
10

Pour référence il y a encore une faute de frappe dans ce qui précède, j'ai également un autre ajout qui permet d'éviter les avertissements d'avoir à jeter à chaque fois. si vous utilisez:

#import "MyAppDelegate.h" 
#define myAppDelegate (MyAppDelegate *) [[UIApplication sharedApplication] delegate] 

je mets ci-dessus dans un constants.h et peut alors utiliser

[myAppDelegate doSomething]; 

partout où j'importer constants.h

Questions connexes