NSMutableDictionary Доступ из разных классов - PullRequest
2 голосов
/ 11 ноября 2009

В своем приложении для iPhone я использовал целые числа для отслеживания множества переменных. Я объявил и инициализировал их все в своем файле AppDelegate (это приложение с несколькими представлениями), а затем, если бы я объявил их в других представлениях (классах), значения остались бы прежними. Таким образом, я мог бы установить Money = 200 в файле делегата приложения, а затем в другом представлении просто объявить «int Money;» и он будет уже установлен на 200 (или на что бы деньги ни попали).

Однако, если я храню все эти переменные в Словаре (что я делаю сейчас), как я могу получить доступ к этому словарю из разных классов / представлений? Я не могу просто «объявить» это снова, я уже попробовал это. Я думаю, что это связано с тем, что словарь является объектом, и поэтому на него нужно ссылаться или что-то в этом роде.

Мне нужно иметь доступ к одному и тому же словарю из всех разных представлений.

#import "SheepAppDelegate.h"

@implementation SheepAppDelegate

@synthesize window;
@synthesize rootController;

//Initialize the Dictionary to store all of our variables

NSMutableDictionary *theHeart;



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

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

    NSMutableDictionary *theHeart = [[NSMutableDictionary alloc] init];


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


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

Инициализируйте словарь и добавьте в него материал, но он работает в другом классе.

#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];
}

Вы видите, что я снова пытаюсь инициализировать словарь для этого класса, но это, очевидно, не работает. Я просто хочу инициализировать и настроить словарь один раз в файле AppDelegate, а затем получить доступ к этому словарю из других классов, чтобы что-то изменить в нем. Есть ли способ сделать это?

Ответы [ 3 ]

6 голосов
/ 11 ноября 2009

Сделайте ваш экземпляр NSMutableDictionary статическим и напишите метод класса для доступа к нему. Поместите это в свой SheepAppDelegate.m:

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

    return theHeart;
}

И получить к нему доступ в любом месте, используя:

NSMutableDictionary *dict = [SheepAppDelegate theHeart];
2 голосов
/ 12 ноября 2009

Нет веской причины не просто передавать словарь в качестве справки вашему контроллеру. Если вы создадите NSMutableDictionary ivar в вашем OverviewController, сделав его свойством, вы можете установить словарь там при создании контроллера или при его оттаивании из пера.

Синглтоны полезны, но я бы не стал прибегать к этому, если вам это действительно не нужно. Вы можете изменить свой -applicationDidFinishLaunching на что-то вроде этого:

- (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];
}

Это предполагает, что ваш rootController имеет тип OverviewController. Затем в заголовке OverviewController вы должны объявить свойство следующим образом:

@ property (assign) NSMutableDictionary * heartDictionary;

и затем @synthesize его в файле .m с помощью @synthesize heartDictionary;.

Опять же, я бы не использовал Синглтон, если вам это не нужно. Вместо этого передайте его как переменную вашему контроллеру.

2 голосов
/ 11 ноября 2009

Вы можете поместить его в свой AppDelegate или создать Singleton. Эта статья охватывает эту тему и многие из возможных вариантов, включая два, которые я упомянул.

Синглтоны кажутся более организованным методом. Вы можете хранить всю свою глобальную информацию в одном, и вы сможете получить к ней доступ из любого места.

...