2009-04-07 12 views
5

Mam inne pytanie dotyczące przywracania stanu aplikacji na iPhonie. Proste dane (takie jak wybrana karta) mogą być przechowywane w NSUserDefaults, ale to za mało.Kolejne pytanie dotyczące stanu aplikacji na telefon iPhone:

Chcę przywrócić cały stan, w tym Kontrolery nawigacyjne (przejdź do kontrolera pod-podrzędnego View).

Mój problem polega na tym, że moja aplikacja jest podzielona na kilka plików XIB, więc na początku wszystkie kontrolery widoku nie są tworzone. Czy istnieje sposób na "wymuszenie" instanciation z pliku Xib?

(nie mam kodu pod ręką, ale mogę spróbować napisać mały koniec, jeśli nie jest jasne)

dzięki.

Odpowiedz

5

Wywołanie [viewController view] będzie upewnić się, że XIB danego widoku kontrolera jest załadowany, po to jest, można użyć dowolnej z jego innych właściwości normalnie

Oto, co staram się robić:

@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 

Każdy poziom hierarchii widoku dba o własnym stanie oszczędzania, więc kontroler aplikacja nie musi wiedzieć o wszystkich możliwych poglądów i nakazujące mogli być w.

+0

Wydaje się być idealnym rozwiązaniem, przetestuję to tak szybko, jak to możliwe. Dzięki ! –

+0

Ładowanie wszystkich kontrolerów podczas uruchamiania łamie koncepcję ładowania ich leniwie, zwiększając czas uruchamiania aplikacji i zużycie pamięci. – Kornel

+0

Nie ładuje wszystkich kontrolerów, ponieważ podcontroller nie jest załadowany, chyba że superkontroler ma dla niego identyfikator rekordu. –

4

Robię to w mojej aplikacji, Litho Graph. Jeśli jesteś na stronie po zamknięciu, to przy następnym uruchomieniu przywraca on tę stronę. Jest to również łatwe: w moim głównym widoku kontrolera viewDidLoad sprawdzam, czy ostatnio przeglądany klucz w ustawieniach domyślnych użytkownika. Jeśli nic nie ma, kontynuuję normalnie (i wyświetlam listę wszystkich stron). Jeśli coś jest, otwieram tę stronę (przesuwając nowy kontroler widoku na stos kontrolerów nawigacyjnych).

Rzeczywiste ładowanie kontrolerów widoku jest bardzo proste: po prostu je utworzę. Każda z moich klas kontrolerów widoku została nadpisana -init do wywołania -initWithNibName: bundle: on super, więc wywołanie + alloc i -init do utworzenia instancji kontrolera widoku wystarcza do załadowania jej z odpowiedniego pliku .xib. Potem, jak opisano powyżej, wciskam go na stosie kontrolera nawigacyjnego:

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

Można zrobić to za wiele warstw głęboko, jak trzeba, oczywiście, ale należy pamiętać, że może chcesz przesunąć widok kontrolerów bez animacji, jeśli będzie kilka przejść; byłoby odwrotne aby użytkownik musiał czekać przez kilka animacji (:.

0

Zobacz przykładowy kod jabłek "drilldownsave". robi dokładnie to, co chcesz