1

接続情報 (クライアント ID、サーバー アドレス、ポート番号) の plist を共有する 3 つのタブのアプリケーションがあります。各ビュー コントローラーでは、NSUserDefaults オブジェクトが viewDidLoad メソッド内で初期化されます。

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

私のビューの 1 つは、ユーザーが plist を変更できるようにする「設定」ページを表しています。ただし、plist が更新されると、オブジェクトごとに同期が必要になるため、変更がすべてのタブ ビューに反映されるわけではありません。

[defaults synchronize];

viewDidLoad メソッドは、アプリケーションの存続期間中に (少なくともタブ バー アプリケーションの場合は) 1 回しか呼び出されないことを知ったので、同期呼び出しをここに置くことはできません。次に AppDelegate クラスに目を向けると、tabBarController メソッドを発見しました。このメソッドを使用して、同期ボタンを必要とせずにすべてのビュー コントローラー間で 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;
    }
}

ありがとうございます。

4

3 に答える 3

1

すべてのビュー表示で再同期して多くの余分な読み込みを強制するのではなく、読み込まれたときに各ビュー コントローラーを通知オブザーバーとして登録することができます (viewDidLoad)。設定を変更するたびに、"settings_changed " 通知。(これは、通信する必要があるオブジェクトを分離するための非常に便利なパターンです)。

したがって、各 viewDidLoad メソッドには次のようになります。

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

viewDidUnload は vc を登録解除します。

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

イベントを処理します。

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

変更を行う場所は次のようになります。

  [[NSNotificationCenter defaultCenter] 
     postNotificationName:@"Defaults_changed"
                   object: nil];
于 2011-07-08T23:32:19.500 に答える
0

変更を加えたときにのみ電話をかける必要がありsynchronizeます。setObject:obj forKey:@"key"オブジェクトを設定するために呼び出すたびに、synchronize直後に呼び出します。

また、オブジェクトを設定するなど、NSUserDefaults共有インスタンスを直接使用するためのポインタを作成する代わりに。次に、オブジェクトを設定した後に呼び出します。[[NSUserDefaults standardUserDefaults] objectForKey:@""];[[NSUserDefaults standardUserDefaults] setObject:obj forKey:@""];synchronize

于 2011-07-08T23:14:42.113 に答える
0

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

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

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

于 2011-07-08T23:09:28.003 に答える