4

アプリのデリゲートを使用して変数を設定し、アプリケーションのどこでも使用できるようにするという概念に、私は非常に混乱しています。これが私のコードです:

appdelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
    NSMutableString *globalUsername;
}
@property (strong, nonatomic) UIWindow *window;
@property (nonatomic, retain) NSMutableString *globalUsername;

appdelegate.m

@synthesize globalUsername;

および別のビューシーン(値を設定しようとしている「Forum.h」と呼ばれる)

AppDelegate *appDelegate = (MyAppDelegate *)[[[UIApplication sharedApplication] delegate]];
[appDelegate globalUsername appendString;

もちろん、最後の行は不完全ですが、xcode は自動的に globalUsername 変数を取得します。「appendString」関数を呼び出して実際に変更することはできません。

4

6 に答える 6

11

ええと、ユーザー名を保存しようとしている場合は、単に NSUserDefaults を使用しないのはなぜですか?

// set the username
[[NSUserDefaults standardUserDefaults] setValue:@"johnsmith" forKey:@"username"];
[[NSUserDefaults standardUserDefaults] synchronize];

// retrieve the user name
NSString *username = [[NSUserDefaults standardUserDefaults] valueForKey:@"username"];
于 2013-01-12T15:27:48.390 に答える
6

[] のセットが 1 つありません。実際には 2 つのステートメントが 1 つになっています。最初にメソッド globalUsername が appDelegate で呼び出され、その結果としてメッセージ appendString が送信されます (これにはパラメーターがありません)。

したがって、これは代わりに次のようになります。

[[appDelegate globalUsername] appendString:@"foobar"];

ただし、ゲームの場合、このようにアプリ デリゲートを悪用するべきではありません。むしろ、ゲームの状態を保存するグローバルな場所が必要な場合は、ここで説明したようにシングルトンを検討することをお勧めします: http://www.cocoanetics.com/2009/05/the-death-of-global-variables /

PS: いくつかの理由から、おそらく可変文字列を使用したくないでしょう。property/ivar を通常の NSString に設定してから設定することをお勧めします。ユーザー名に文字を追加する理由がわかりません。NSString は不変ですが、単純に他のものに置き換えることができます。

[[appDelegate setGlobalUsername:@"foobar"];

または同じ効果で:

appDelegate.globalUsername = @"foobar";
于 2013-01-12T07:27:36.963 に答える
4

NSMutableString の場合、'Delegate' クラスに alloc - init があります。

可変オブジェクトの場合は、割り当てて初期化する必要があるためです。

まず、Delegate.m クラスで

globalUserName = [[NSMutableString alloc] init];

それで、

ViewController では、次を使用できます。

appDelegate.globalUsername appendString ....(What you want)

ありがとう。

于 2013-01-12T07:26:03.147 に答える
2

デリゲートとそのビュー コントローラーの関係がごちゃ混ぜになっていると思います。アプリを起動すると、AppDelegate が作成されます。Forum.h で AppDelegate を作成するのではなく、ViewController であるフォーラムを AppDelegate で作成します。また、中括弧内の *globalUserName は不要です。

したがって、AppDelegate.h は次のようになります。

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (nonatomic, retain) NSMutableString *globalUsername;
@property (nonatomic, retain) Forum *forum;

また、現在のバージョンの Xcode と Objective-C では、合成も不要です。自動的にセットアップおよび初期化されます。AppDelegate.m では、次を使用して *globalUsername を参照できます。

self.globalUsername

AppDelegate.m には、applicationDidLaunch に以下も含める必要があります。

[[self.forum alloc] init];  //Allocate and initialize the forum ViewController
self.forum.delegate = self; //Set the forum ViewController's delegate variable to be the AppDelegate itself

しかし、フォーラムの ViewController には現在、delegate という名前の変数がないため、作成する必要があります。したがって、Forum.h に以下を追加する必要があります。

@property (nonatomic) id delegate;

Forum.m では、AppDelegate.m がデリゲートの設定を処理したので、Forum のデリゲート変数を使用して AppDelegate のデータを参照できるようになりました。

最後に、Forum.m から globalUsername にアクセスするために、self.delegate.globalUsername を使用できます。したがって、Forum.m からの文字列に追加するには、次を使用できます。

[self.delegate.globalUsername appendString:myNewString];

「myNewString」は、globalUsername に追加する文字列です。

お役に立てれば。

于 2013-01-12T09:34:22.517 に答える
0

忘れていると思いますallocallocメソッドで一度だけapplication did finish launching

于 2013-01-12T07:26:14.297 に答える
0

@interface AppDelegate : UIResponder <UIApplicationDelegate> { NSMutableString *globalUsername; }

これはグローバル変数を作成しません。実際、それは AppDelegate クラスの保護されたメンバーです。

すべてのクラスからアクセスできません。AppDelegate のさらに別のインスタンスを作成する必要があり、その ivar を賢くします。

グローバルという用語は、すべてのクラスのアプリケーション全体で同じ値を持つことを意味します。また、毎回 alloc+init する必要はありません。

グローバル変数の場合、静的変数を作成する必要があります。共有クラス/シングルトン クラスが適しています。

于 2013-01-12T07:29:28.247 に答える