2009-11-11 6 views
2

Dans mon application iPhone, j'utilisais des entiers pour suivre un grand nombre de variables. Je les ai déclarés et initialisés dans mon fichier AppDelegate (il s'agit d'une application multiview), puis si je les déclarais dans les autres vues (classes) et que les valeurs resteraient les mêmes. De cette façon, je pourrais définir Money = 200 dans le fichier App Delegate, puis dans une autre vue, déclarez simplement, "int Money"; et il serait déjà réglé à 200 (ou quoi que ce soit d'argent.)NSMutableDictionary Accès à partir de différentes classes

Cependant, si je stocke toutes ces variables dans un dictionnaire (ce que je fais maintenant), comment puis-je accéder à ce dictionnaire de différentes classes/vues? Je ne peux pas simplement le "déclarer" à nouveau, j'ai déjà essayé ça. Je pense que cela a à voir avec le dictionnaire étant un objet, et donc il doit être référencé ou quelque chose.

Je dois pouvoir accéder au même dictionnaire à partir de toutes les vues différentes. Initialiser le dictionnaire et ajouter des trucs dessus fonctionne correctement, mais dans une autre classe.

#import "OverviewController.h" 

@implementation OverviewController  

@synthesize lblMoney; 
@synthesize lblSheep; 
@synthesize lblWool; 
@synthesize lblFatness; 
@synthesize lblCapacity; 
@synthesize lblShepherds; 

int varMoney; 

NSMutableDictionary *theHeart; 

- (void)viewWillAppear:(BOOL)animated {  
    varMoney = [[theHeart objectForKey:@"Money"] intValue]; 
} 

Vous pouvez voir que j'essaie d'initialiser à nouveau le dictionnaire pour cette classe, mais cela ne fonctionne évidemment pas. Je veux simplement initialiser et configurer le dictionnaire une fois, dans le fichier AppDelegate, puis accéder à ce dictionnaire à partir des autres classes pour y changer des choses. Y a-t-il un moyen de faire cela?

Répondre

6

Rendez votre instance NSMutableDictionary statique et écrivez une méthode de classe pour y accéder. Mettez dans votre SheepAppDelegate.m:

static NSMutableDictionary *theHeart; 
+ (NSMutableDictionary*)theHeart 
{ 
    if (theHeart == nil) theHeart = [[NSMutableDictionary alloc] init]; 

    return theHeart; 
} 

et y accéder partout ailleurs en utilisant:

NSMutableDictionary *dict = [SheepAppDelegate theHeart]; 
2

Vous pouvez soit le mettre dans votre AppDelegate ou créer un Singleton. This article couvre ce sujet et de nombreuses options possibles, y compris les deux que j'ai mentionné.

Les singletons semblent être la méthode la plus organisée. Vous pouvez stocker toutes vos informations globales en une seule fois et vous pourrez y accéder de n'importe où.

2

Il n'y a pas de bonne raison de ne pas passer simplement le dictionnaire le long de votre contrôleur comme référence. Si vous créez un ivar NSMutableDictionary dans votre OverviewController en en faisant une propriété, vous pouvez alors y définir le dictionnaire lorsque vous créez votre contrôleur ou lorsqu'il est décongelé à partir de la plume.

Singletons sont utiles, mais je ne voudrais pas y recourir sauf si vous en avez vraiment besoin. Vous pouvez changer votre -applicationDidFinishLaunching à quelque chose comme ceci:

- (void)applicationDidFinishLaunching:(UIApplication *)application {  

    //Set the values for the Variables and Constants, these are 
    //accessed from the different classes. 

    NSMutableDictionary *theHeart = [NSMutableDictionary dictionary]; 

    [theHeart setObject:[NSNumber numberWithInt:200] forKey:@"Money"]; 
    [theHeart setObject:@"Number two!" forKey:@"2"]; 

    [rootController setHeartDictionary:theHeart]; 

    [window addSubview:rootController.view]; 
    [window makeKeyAndVisible]; 
} 

Cela suppose que votre rootController est de type OverviewController. Ensuite, dans votre en-tête OverviewController, vous devez déclarer une propriété comme ceci:

@property (assign) NSMutableDictionary * heartDictionary;

puis @synthesize dans le fichier .m avec @synthesize heartDictionary ;.

Encore une fois, je n'utiliserais pas un Singleton à moins que vous en ayez besoin. Passez-le en tant que variable à votre contrôleur à la place.

Questions connexes