1

我有一个三选项卡应用程序,它共享一个用于连接信息(客户端 ID、服务器地址、端口号)的 plist。在每个视图控制器中,一个 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"];
}

我的一个视图代表一个“设置”页面,允许用户对 plist 进行更改。但是,当更新 plist 时,更改不会反映在所有选项卡视图中,因为每个对象都需要同步

[defaults synchronize];

我了解到 viewDidLoad 方法在应用程序的生命周期内只调用一次(至少对于 Tab Bar 应用程序),所以我不能把同步调用放在这里。然后我转向 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

尝试同步默认值viewWillAppear而不是viewDidLoad.

可能会发生viewDidLoad多次调用(在这种情况下,viewDidUnload将在之间调用),例如,如果存在内存问题。

通过同步 中的默认值viewWillAppear,您可以确保相关UIViewController内容在它成为选定的视图控制器之前被更新。

于 2011-07-08T23:09:28.003 回答
0

您只需synchronize在进行更改后致电。每次调用setObject:obj forKey:@"key"设置对象,synchronize事后直接调用。

此外,不是创建一个指针来NSUserDefaults尝试直接使用共享实例,[[NSUserDefaults standardUserDefaults] objectForKey:@""];而是[[NSUserDefaults standardUserDefaults] setObject:obj forKey:@""];设置对象。然后synchronize在设置对象后调用。

于 2011-07-08T23:14:42.113 回答