Próbuję zaimplementować przywracanie stanu w aplikacji, która używa systemu iOS 6+ i scenorysów, ale mam problemy ze znalezieniem sposobu, aby zapobiec duplikowaniu wywołań na ciężkich metodach.UIViewController wywołania cyklu życia w połączeniu z przywracaniem stanu
Gdybym po prostu uruchomić aplikację, a potem muszę konfiguracji interfejsu użytkownika w viewDidLoad
:
- (void)viewDidLoad {
[super viewDidLoad];
[self setupUI];
}
Działa to dobrze w normalnym, non-state-konserwatorskich świata. Teraz Dodałem przywrócenie stanu i po przywróceniu pewne właściwości muszę zaktualizować UI z tych właściwości:
- (void)decodeRestorableStateWithCoder:(NSCoder *)coder {
[super decodeRestorableStateWithCoder:coder];
// restore properties and stuff
// [...]
[self setupUI];
}
Więc co się dzieje teraz jest to, że pierwsza metoda setupUI
jest wywoływana z viewDidLoad
, a następnie ponownie od decodeRestorableStateWithCoder:
. Nie widzę metody, którą mogę przesłonić, która zawsze jest nazywana ostatnią.
Jest to normalny porządek metoda nazywa:
- awakeFromNib
- viewDidLoad
- viewWillAppear
- viewDidAppear
Podczas korzystania przywrócenie stanu, nazywa się to:
- awakeFromNib
- viewDidLoad
- decodeRestorableStateWithCoder
- viewWillAppear
- viewDidAppear
nie mogę umieścić wezwanie do setupUI
w viewWillAppear
bo wtedy byłoby również wykonywane za każdym razem, gdy z powrotem do ojczystego widok.
Byłoby znacznie wygodniej, gdyby decodeRestorableStateWithCoder
było nazywane PRZED viewDidLoad
, ponieważ wtedy mógłbyś użyć przywróconych właściwości. Niestety, nie w tym przypadku, więc ... jak mogę zapobiec wykonywaniu pracy w viewDidLoad
, gdy wiem, że muszę to zrobić od razu w decodeRestorableStateWithCoder
zaraz po?
Ustawiłem wartość boolean na NIE w viewDidLoad, a jeśli NIE, to zrób rzeczy w viewWillAppear. Zakładam, że nie chcesz tego robić w ten sposób? –
Może rzeczywiście być najbardziej pragmatyczne rozwiązanie, tak. Po prostu wydaje się "nie tak" :) –
@NitinAlabur nie ma powodu, aby ustawiać wartość 'NO' w' viewDidLoad' z powodu domyślnej wartości 'BOOL'. – k06a