2011-07-08 12 views
1

私は接続情報(クライアントID、サーバーアドレス、ポート番号)のplistを共有する3つのタブアプリケーションを持っています。ビューコントローラのそれぞれにおいて、NSUserDefaultsオブジェクトは、viewDidLoadメソッド内で初期化されています。私の意見のタブバーアプリケーション間でplistの同期

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // load default settings into class instance variables 
    defaults = [NSUserDefaults standardUserDefaults]; 
    self.clientID = [defaults objectForKey:@"clientID"]; 
    self.serverAddress = [defaults objectForKey:@"serverAddress"]; 
    self.serverPort = [defaults objectForKey:@"serverPort"]; 
} 

一つは、ユーザーがPLISTに変更を加えることを可能にする「設定」ページを表します。 plistのが更新されたときしかし、同期は、オブジェクトごとに必要とされているため、変更は、タブビューのすべてに反映されていません。

[defaults synchronize]; 

私はviewDidLoadメソッドが唯一であることを学びました(少なくともTab Barアプリケーションの場合)アプリケーションの存続期間中に一度呼び出されるため、ここで同期呼び出しを行うことはできません。私はAppDelegateクラスに目を向け、tabBarControllerメソッドを発見しました。このメソッドを使用して、同期ボタンを必要とせずにすべてのView ControllerでNSUserDefaultsオブジェクトを同期させる方法を教えてください。これは、アプリケーションが開いている間に環境設定を共有/調整する正しい方法ですか?

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { 

    // I need to synchronize somewhere in here??? 
    switch (tabBarController.selectedIndex) 
    { 
    case 0: 
     NSLog(@"Tab 0 selected"); 
     break; 
    case 1: 
     NSLog(@"Tab 1 selected"); 
     break; 
    case 2: 
     NSLog(@"Tab 2 Selected"); 
     break; 
    } 
} 

感謝を前もって:私は今でだのはここ

です。

答えて

0

viewDidLoadの代わりにviewWillAppearのデフォルトを同期させてみてください。

たとえば、メモリの問題がある場合など、viewDidLoadが複数回呼び出されることがあります(この場合、viewDidUnloadが呼び出されます)。

デフォルトをviewWillAppearに同期させることにより、関連するUIViewControllerが選択されたビューコントローラになる直前に更新されます。

+0

さらに悪いことです。 viewWillAppearは、ビューが表示されるたびに呼び出されますが、viewDidLoadは、ビューがロードされたときに一度呼び出されます。 –

+0

あなたはそれをviewWillAppearに置く必要があります。それ以外の場合は、各ディスプレイ(タブバーの切り替えビュー)で同期しません。 –

+0

はい、それは私の主張でした。このようにしているというあなたのコメントは彼の方法よりも悪いですか?そうでなければ、私はあなたの最初のコメントを誤解しました。 – PengOne

0

変更を行ったときにsynchronizeに電話する必要があります。オブジェクトを設定するためにsetObject:obj forKey:@"key"に電話するたびに、synchronizeに直接呼び出してください。

NSUserDefaultsへのポインタを作成する代わりに、[[NSUserDefaults standardUserDefaults] objectForKey:@""];および[[NSUserDefaults standardUserDefaults] setObject:obj forKey:@""];などの共有インスタンスを直接使用してオブジェクトを設定してみてください。次に、オブジェクトを設定した後にsynchronizeに電話してください。

+0

問題は、彼が 'viewDidLoad'でViewControllerごとにデフォルト値を一度だけロードするため、変更が行われた後にViewControllerに反映されないことです。 – PengOne

+0

「読み込み」をどのように定義しますか?変更を加えた直後にデフォルトを同期し、ポインタを作成する代わりに共有インスタンスを直接使用すると、ポインタを取得するとすべての変更がそこにあります。 – Greg

1

各ビュー表示を再同期することによって多くの余分な負荷を強制するのではなく、各ビューコントローラをロードしたときに通知オブザーバとして登録できます(viewDidLoad)。 "settings_changed"通知を送信してください。 (これは、通信する必要があるオブジェクトを切り離すための非常に有用なパターンです)。

だからあなたのviewDidLoadメソッドのそれぞれはこれを持つことになります。

- (void) refreshDefaults { 
    // re-load your defaults here 
} 

どれ位になる:

[[NSNotificationCenter defaultCenter] 
     removeObserver: self 
        name: @"Defaults_changed" 
       object: nil]; 

がイベントをハンドル:

[[NSNotificationCenter defaultCenter] 
     addObserver:self 
      selector:@selector(refreshDefaults) 
       name:@"Defaults_changed" 
      object:nil]; 

viewDidUnloadがVCの登録を解除します変更はこれを行います:

[[NSNotificationCenter defaultCenter] 
    postNotificationName:@"Defaults_changed" 
        object: nil]; 
+0

ありがとうございます。私はこの方法をテストしており、実際に動作します。いずれにしても、私のアプリケーションは負荷が無視できるほど小さいです。 – CountZachula

関連する問題