2009-04-07 4 views
5

У меня есть еще один вопрос о восстановлении состояния приложения на iPhone. Простые данные (например, выбранная вкладка) могут храниться в NSUserDefaults, но этого недостаточно.Другой вопрос о состоянии приложения iPhone

Я хочу восстановить все состояние, включая навигационные контроллеры (перейдите к суб-вспомогательному контроллеру представления).

Моя проблема заключается в том, что мое приложение разделено на несколько xib-файлов, поэтому в начале все контроллеры View не создаются. Есть ли способ «заставить» instanciation из xib-файла?

(у меня нет кода под рукой, но я могу попробовать написать небольшой конец, если не понятно)

Спасибо большое.

ответ

5

Вызов [viewController view] убедитесь, что XIB данного представления контроллера загружается, как только это, вы можете использовать любой из других его свойств нормально

Вот что я склонен делать:

@class Record; // some model object--I assume it has an integer record ID 
@class DetailViewController; 

@interface RootViewController : UIViewController { 
    IBOutlet DetailViewController * detailController; 
} 

- (void)restore; 
... 
@end 

@implementation RootViewController 

// Note: all detailController showings--even ones from within 
// RootViewController--should go through this method. 
- (void)showRecord:(Record*)record animated:(BOOL)animated { 
    [self view]; // ensures detailController is loaded 

    [[NSUserDefaults standardUserDefaults] setInteger:record.recordID 
               forKey:@"record"]; 
    detailController.record = record; 

    [self.navigationController pushViewController:detailController 
             animated:animated]; 
} 

- (void)restore { 
    int recordID = [[NSUserDefaults standardUserDefaults] integerForKey:@"record"]; 

    if(recordID) { 
     Record * record = [Record recordWithID:recordID]; 
     [rootViewController showRecord:record animated:NO]; 
     // If DetailViewController has its own state to restore, add this here: 
     // [detailController restore]; 
    } 
} 
... 
- (void)viewDidAppear:(BOOL)animated { 
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"record"]; 
} 
@end 

@implementation MyAppDelegate 

- (void)applicationDidFinishLaunching:(UIApplication*)application { 
    ... 
    [rootViewController restore]; 
    ... 
} 
... 
@end 

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

+0

Это идеальное решение, я проверю это как можно скорее. Благодаря ! –

+0

Загрузка всех контроллеров при запуске запускает концепцию загрузки их лениво, увеличивая время запуска приложения и использование памяти. – Kornel

+0

Он не загружает все контроллеры, потому что субконтроллер не загружен, если у суперконтроллера нет идентификатора записи. –

4

Я делаю это в своем приложении, Litho Graph. Если вы находитесь на странице, когда вы уходите, то при следующем запуске она восстанавливает вас на этой странице. Это тоже довольно просто: в моей реализации -viewDidLoad контроллера моего главного представления я проверяю ключ последней просмотренной страницы по умолчанию для пользователя. Если ничего нет, я продолжаю как обычно (и покажу список всех страниц). Если что-то есть, я открою эту страницу (нажав новый контроллер представления на стек навигационного контроллера).

Фактическая загрузка контроллеров представлений очень проста: я просто создаю их. Каждый из моих классов контроллера просмотра переопределен - для вызова -initWithNibName: bundle: on super, поэтому вызов + alloc и -init для создания экземпляра контроллера представления достаточно, чтобы загрузить его из соответствующего .xib-файла. Затем, как описано выше, я толкаю его на стек навигационный контроллер в:

[self.navigationController pushViewController: controller animated: YES]; 

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

0

Посмотрите на пример кода яблок "drilldownsave". делает именно то, что вы хотите

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