Синхронизация plist через приложение панели вкладок - PullRequest
1 голос
/ 09 июля 2011

У меня есть приложение с тремя вкладками, которое разделяет список сведений о подключении (идентификатор клиента, адрес сервера, номер порта). В каждом из контроллеров представления объект 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 изменения не отражаются во всех представлениях вкладок, поскольку для каждого из объектов необходима синхронизация :

[defaults synchronize];

Я узнал, что метод viewDidLoad вызывается только один раз за время существования приложения (по крайней мере, для приложения панели вкладок), поэтому я не могу поместить здесь вызовы синхронизации. Затем я обратился к классу 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;
    }
}

Спасибо заранее.

Ответы [ 3 ]

1 голос
/ 09 июля 2011

Вместо того, чтобы вызывать много дополнительных нагрузок путем повторной синхронизации на каждом экране просмотра, вы можете сделать так, чтобы каждый из ваших контроллеров представления регистрировался как наблюдатель уведомлений, когда они загружаются (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];
0 голосов
/ 09 июля 2011

Вам нужно позвонить synchronize только после внесения изменений. Каждый раз, когда вы вызываете setObject:obj forKey:@"key" для установки объекта, сразу после этого вызывайте synchronize.

Кроме того, вместо создания указателя на NSUserDefaults попробуйте напрямую использовать общий экземпляр, например [[NSUserDefaults standardUserDefaults] objectForKey:@""]; и [[NSUserDefaults standardUserDefaults] setObject:obj forKey:@""]; для установки объектов. Затем вызовите synchronize после установки объекта.

0 голосов
/ 09 июля 2011

Попробуйте синхронизировать значения по умолчанию в viewWillAppear вместо viewDidLoad.

Может случиться, что viewDidLoad вызывается несколько раз (в этом случае viewDidUnload будет вызываться между), например, если есть проблема с памятью.

Синхронизируя значения по умолчанию в viewWillAppear, вы гарантируете, что соответствующий UIViewController обновляется непосредственно перед тем, как он становится выбранным контроллером представления.

...