2015-05-26 3 views
0

Я довольно новичок в UIPageViewControllers. У меня есть настройка, которая может отображаться через различные типы UIViewControllers.UIPageViewController и сохранение состояния UIViewControllers

Я заметил, что когда я перехожу назад к предыдущему, все данные и состояния сбрасываются (т. Е. Я ранее менял цвет фона UIViewController и возвращал его обратно к умолчанию). Я использую идентификаторы восстановления из панели рассказов, чтобы инициировать эти контроллеры.

Если я использую это, не должен ли он сохранять состояние контроллера?

Код для изменения контроллеров:

#pragma mark - UIPageViewControllerDataSource 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController 
{ 

    //This is nice and avoids having to use a counter 
    NSString *vcRestorationID = viewController.restorationIdentifier; 
    NSUInteger index = [self.controllerRestorationIDs indexOfObject:vcRestorationID]; 

    if (index == 0) { 
     return nil; 
    } 

    return [self viewControllerAtIndex:index - 1]; 
} 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController 
{ 
    NSString *vcRestorationID = viewController.restorationIdentifier; 
    NSUInteger index = [self.controllerRestorationIDs indexOfObject:vcRestorationID]; 

    //Don't allow it to go forward if there is one at the end 
    if (index == self.controllerRestorationIDs.count - 1) { 
     return nil; 
    } 

    return [self viewControllerAtIndex:index + 1]; 
} 


#pragma mark - Private Methods 

- (UIViewController *)viewControllerAtIndex:(NSUInteger)index 
{ 
    // Only process a valid index request. 
    if (index >= self.controllerRestorationIDs.count) { 
     return nil; 
    } 

    // Create a new view controller. 
    BaseContentViewController *contentViewController = (BaseContentViewController *)[self.storyboard instantiateViewControllerWithIdentifier:self.controllerRestorationIDs[index]]; 

    // Set any data needed by the VC here 
    contentViewController.rootViewController = self; 

    return contentViewController; 

} 

Есть ли способ сделать это так, состояние сохраняется и контроллеры не перезагружается каждый раз?

ответ

1

Такое поведение происходит, потому что каждый раз, когда вы обращаетесь к нему, вы управляете новым контроллером.

Чтобы решить эту проблему:

  • можно кэшировать контроллеры просмотра: хранить их в глобальном изменяемый массив контроллера просмотра страницы и проверьте каждый раз, когда контроллер просмотра страницы запрашивает источник данных для контроллера представления , добавьте его в глобальный массив или верните его, если он уже там.
  • использовать переменные класса вместо переменных экземпляра для свойств, которые вы изменяете в контроллерах представления.

Первое решение является изменчивым: всякий раз, когда страница VC освобождается, вы потеряете изменения, внесенные в контроллеры представления. Второй - более уверен.

+0

Используя второе решение, вы имеете в виду переменные хранилища в контроллере корневого представления, а затем передаете их каждый раз, когда создается новый контроллер? – Kex

Смежные вопросы