2

私のiPhoneアプリでは、整数を使用して多くの変数を追跡していました。AppDelegateファイル(マルチビューアプリ)ですべてを宣言して初期化し、他のビュー(クラス)で宣言しても値は同じままになります。このようにして、AppDelegateファイルでMoney= 200を設定し、別のビューで「intMoney;」と宣言することができます。そしてそれはすでに200に設定されているでしょう(またはMoneyがたまたまあったとしても)。

ただし、これらすべての変数をディクショナリ(現在実行している)に格納している場合、さまざまなクラス/ビューからそのディクショナリにアクセスするにはどうすればよいですか?もう一度簡単に「宣言」することはできません。すでに試しました。辞書がオブジェクトであることに関係していると思うので、参照する必要があります。

すべての異なるビューから同じ辞書にアクセスできる必要があります。

#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ファイルでディクショナリを一度初期化してセットアップしてから、他のクラスからそのディクショナリにアクセスして、その中の内容を変更したいと思います。これを行う方法はありますか?

4

3 に答える 3

6

NSMutableDictionaryインスタンスを静的にし、それにアクセスするためのクラスメソッドを記述します。これをSheepAppDelegate.mに入れてください:

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

    return theHeart;
}

そして、以下を使用して他の場所にアクセスします。

NSMutableDictionary *dict = [SheepAppDelegate theHeart];
于 2009-11-11T20:41:39.560 に答える
2

辞書を参照としてコントローラーに渡さない理由はありません。OverviewControllerでNSMutableDictionaryivarを作成してプロパティにする場合は、コントローラーを作成するとき、またはニブから解凍するときに、そこにディクショナリを設定できます。

シングルトンは便利ですが、本当に必要でない限り、私はそれに頼りません。-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(割り当て)NSMutableDictionary * heartDictionary;

次に、@synthesizeheartDictionary;を使用して.mファイルで@synthesizeします。

繰り返しますが、必要がない限り、シングルトンは使用しません。代わりに、それを変数としてコントローラーに渡します。

于 2009-11-11T21:33:44.523 に答える
2

AppDelegateに配置するか、シングルトンを作成できます。この記事では、このトピックと、私が言及した2つを含む可能なオプションの多くについて説明します。

シングルトンは、より組織化された方法のようです。すべてのグローバル情報を1つに保存でき、どこからでもアクセスできます。

于 2009-11-11T20:19:12.457 に答える