29 votes

Abréviation de [[UIApplication sharedApplication] delegate] ?

J'ai stocké des variables globales dans mon AppDelegate et j'y accède par :

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

Quelle est la meilleure façon d'économiser de la frappe et de ne pas avoir besoin de AppDelegate *d = [[UIApplication sharedApplication] delegate]; encore et encore ? Merci de votre compréhension.

40voto

Nevin Points 2620

En tant que Grenouille hirsute Définissez 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 ......];

11voto

Jason Coco Points 52303

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

Définissez donc l'élément externe dans l'en-tête de votre AppDelegate (ou quelque chose d'autre que vous incluriez partout) :

extern AppDelegate* appDelegate;

Créez-la ensuite et définissez-la dans votre fichier 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;
}

Les autres classes peuvent alors y accéder :

#import "AppDelegate.h"

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

8voto

Shaggy Frog Points 20388

Vous pourriez simplement créer une macro de style C et la placer quelque part dans un fichier d'en-tête.

(Quant à l'utilisation du délégué de l'application comme un gigantesque fourre-tout de variables globales, il s'agit là d'un autre sujet de discussion pour un autre jour).

4voto

Dan Points 214

Je crée un catégorie appelé UIApplication+délégué avec des messages de commodité. L'obtention de mon délégué spécifique est l'un des messages de commodité. Ainsi, par exemple, si le délégué de mon application est appelé MonAppDelegate Il en résulterait ce qui suit :

UIApplication+delegate.h

#import "MyAppDelegate.h"

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

y 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"
}

2voto

drekka Points 10020

J'ai également créé une catégorie, mais j'ai appliqué la mienne à NSObject afin que n'importe quel objet de 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X