0

これは一種のハックニーの質問です。プログラミングの経験はありますが、Objective-cは私にとってまったく新しいものであり、Objective-cの概念全体について明確な定義を見つけることができません。ここに、私がすでに知っているいくつかの理論があります。クラスのインスタンス変数に直接アクセスできないため、アクセスするにはプロパティまたは「アクセサーメソッド」を使用する必要があります。わかった。私はアクセサメソッドによって意味するもののいくつかを試しましたが、うーん、それはすべて間違っています。あなたは私がこれを理解するのを手伝ってくれると思います。

これが私の例です:私はクラスCatと、猫に関する情報を持っているplistを持っています。Plistは、ペットの名前と年齢を保存します。私はこれを作りたい:textField、label、そしてボタンを持つシンプルなビュー。Label-は現在のペット名です。textFieldは、textfield nowメソッドで猫の名前を変更するためのものです(猫の名前の変更は不気味に聞こえますが、これは単なる例です)。名前の変更機能にメッセージを送信するためのボタンです。ホームボタンを押した後、AppDelegate.mファイルを介してファイルに名前を保存したいのですが、それが問題です。以下で説明します。

開くまで非表示になっているブロックにコードをラップする方法がわからないので、ここで大量のコード行を気にしないでください。コードとログ出力のある画面へのリンクを追加します。(誰かが私にそれを行う方法を教えてくれるなら、ここにコードを追加します)が、今のところここにリンクがあります: http ://shlonger.com/680dc6cf21aa426c4bed107213ab4467

AppDelegateから、アプリの動作中に実装されるオブジェクトにアクセスできません。クラス変数用にいくつかのプロパティといくつかのゲッター/セッターメソッドを作成しましたが、AppDelegateでCatクラスを初期化すると、デフォルト(plistファイルなど)の設定で別のオブジェクトが作成されます。AppDelegateを介して現在の設定を正しい方法で保存するにはどうすればよいですか?

長い質問の説明でごめんなさい。

4

1 に答える 1

3

と通信する必要は必ずしもありませんが、AppDelegate経由で通信できます[[UIApplication sharedApplication] delegate]。その後、必要なプロパティにアクセスできますが、おそらくキャストする必要があります。

// assuming your application delegate is of type 'AppDelegate' - usually the default provided by Xcode
AppDelegate *delegate = (AppDelegate*)[[UIApplication shared application] delegate];
// you can now all you application delegat's properties.

Catクラスの別の方法は、アプリのデリゲートによって投稿された通知に登録することです。例えば:

@implementation Cat

-(id)init {
    if ( (self = [super init]) ) {
        // you can also attempt to read stored values form disk here
        // perform all your other initialization that you already have

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(handleNotification:)
                                                     name:UIApplicationDidEnterBackgroundNotification
                                                    obect:[UIApplication sharedApplication];
    }
}

Catクラスでメソッドを定義します。これhandleNotification:は、通知センターに提供されるセレクターであるためです。これは、通知センターが投稿されCatたときにクラスで呼び出すメソッドです。UIApplicationDidEnterBackgroundNotification

-(void)handleNotification:(NSNotification*)notification {
   NSString *name = notification.name;
   id sender = notification.object;

   if ( [name isEqual:UIApplicationDidEnterBackgroundNotification] && [sender isEqual:[UIApplication sharedApplication] ) {
       // save `Cat` class to disk as plist or however you want 
   }
}

UIApplicationDidEnterBackgroundNotificationで代用することもできますUIApplicationWillResignActiveNotification。どちらがお客様のニーズに最も適しているかは、お客様にお任せします。

の使用の詳細NSNotificationCenter

更新

Cat2 番目の方法の利点は、特定の知識や、クラスとアプリケーション デリゲートの間の依存関係が必要ないことです。両方のオブジェクトは、互いに独立して動作できます。は[UIApplication sharedApplication]、iOS アプリケーションで実行されているすべてのオブジェクトで使用できるシングルトンですが、繰り返しになりますが、正確なタイプを知る必要はありません。必要な特定の知識は通知名だけですが、それらにもグローバルにアクセスできます。

于 2013-03-03T22:12:16.033 に答える