2010-11-10 10 views
29

je stockées les variables globales dans mon AppDelegate et d'y accéder par:Courant pour le délégué [[UIApplication sharedApplication]]?

AppDelegate *d = [[UIApplication sharedApplication] delegate]; 
d.someString = ... 

Quelle est la façon de recommander économiser quelques secondes et je ne pas besoin de AppDelegate *d = [[UIApplication sharedApplication] delegate]; encore et encore? Merci!

+0

importer votre AppDelege dans votre fichier pch. En faisant cela, vous n'avez pas besoin d'importer dans chaque fichier et vous pouvez obtenir cette macro n'importe où dans votre projet. – Ans

+0

Notez que si vous vous trouvez en train de taper 'AppDelegate * d = [[UIApplication sharedApplication] delegate];' encore et encore, cela pourrait être une odeur de code. Avez-vous vraiment besoin du délégué de l'application pour les choses app-delegate-ish, ou l'utilisez-vous comme un dépotoir pour l'état global? –

Répondre

41

Comme grenouille Shaggy dit, définir une macro dans votre fichier YourAppDelegate.h, un exemple comme celui-ci:

#define AppDelegate (YourAppDelegate *)[[UIApplication sharedApplication] delegate] 

Ensuite, vous pouvez obtenir le délégué de l'application dans votre code comme ceci:

[AppDelegate ......]; 
+2

This. C'est la meilleure solution. –

+1

Vous n'avez pas besoin d'envelopper entre parenthèses comme ceci: http://stackoverflow.com/questions/4549410/define-the-app-delegate-as-a-constant]? –

+0

Assurez-vous également que "AppDelegate" et "YourAppDelegate" sont des mots différents. Parfois, "YourAppDelegate", c'est-à-dire le nom du délégué de votre application, est simplement "AppDelegate". –

11

Comme votre délégué d'application ne change jamais vraiment, vous pouvez créer un externe que vous définissez dans le code de délégué d'application, très similaire à l'NSApp external pour les applications Mac OS X Cocoa.

Ainsi, définir l'extérieur dans votre tête de AppDelegate (ou quelque chose d'autre que vous devez inclure partout):

extern AppDelegate* appDelegate; 

Ensuite, créez et mettez-le dans votre dossier de mise en œuvre:

AppDelegate* appDelegate = nil; 

// later -- i can't recall the actual method name, but you get the idea 
- (BOOL)applicationDidFinishLaunchingWithOptions:(NSDictionary*)options 
{ 
    appDelegate = self; 
    // do other stuff 
    return YES; 
} 

Ensuite, d'autres classes peuvent simplement y accéder:

#import "AppDelegate.h" 

// later 
- (void)doSomethingGreat 
{ 
    NSDictionary* mySettings = [appDelegate settings]; 
    if([[mySettings objectForKey:@"stupidOptionSet"] boolValue]) { 
    // do something stupid 
    } 
} 
+3

Je préfère cette solution car les accesseurs de notation par points ont travaillé avec cette solution – Rob

8

Vous pourriez juste créer un m acro et le mettre dans un fichier d'en-tête quelque part.

(En ce qui concerne l'utilisation de votre délégué application comme un fourre-tout variable globale géant, c'est une autre diatribe pour un autre jour.)

4

créer un category appelé UIApplication + déléguer avec des messages de proximité en elle. Obtenir mon délégué spécifique étant l'un des messages de commodité. Ainsi, par exemple, si mon délégué app a été appelé MyAppDelegate, il ressemblerait à ceci:

UIApplication + delegate.h

#import "MyAppDelegate.h" 

@interface UIApplication(delegate) 
+ (MyAppDelegate *)thisApp; 
@end 

et UIApplication + delegate.m

#import "UIApplication+delegate.h" 


@implementation UIApplication(delegate) 

+ (MyAppDelegate *)thisApp { 
    return (MyAppDelegate*)[[UIApplication sharedApplication] delegate]; 
} 

@end 

Dans une classe qui a besoin du délégué, je fais ceci:

#import "UIApplication+delegate.h" 

... 

- (void)doStuff { 
    MyAppDelegate *app = [UIApplication thisApp]; 
    // use "app" 
} 
2

J'ai également créé une catégorie, sauf que j'ai appliqué le mien à NSObject afin que n'importe quel objet dans l'application puisse facilement accéder au délégué.


#import "MyAppDelegate.h" 

@interface NSObject(delegate) 
- (MyAppDelegate *) appDelegate; 
@end 

#import "NSObject+delegate.h" 

@implementation UIApplication(delegate) 

- (MyAppDelegate *)appDelegate { 
    return (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
} 

@end