Ich versuche die Statuswiederherstellung in einer App zu implementieren, die iOS 6+ und Storyboards verwendet, aber ich habe Probleme, einen Weg zu finden, doppelte Aufrufe schwerer Methoden zu verhindern.UIViewController Lebenszyklusaufrufe in Kombination mit Statuswiederherstellung
Wenn ich einfach die App starten, dann muss ich Setup die Benutzeroberfläche in viewDidLoad
:
- (void)viewDidLoad {
[super viewDidLoad];
[self setupUI];
}
Dies funktioniert gut in einem normalen, nicht-staatlich Restaurierung Welt. Jetzt habe ich Zustand Restaurierung gegeben, und nach ein paar Eigenschaften der Wiederherstellung Ich brauche die Benutzeroberfläche mit diesen Eigenschaften zu aktualisieren:
- (void)decodeRestorableStateWithCoder:(NSCoder *)coder {
[super decodeRestorableStateWithCoder:coder];
// restore properties and stuff
// [...]
[self setupUI];
}
So was passiert nun, dass zuerst die setupUI
Methode von viewDidLoad
genannt wird, und dann wieder von decodeRestorableStateWithCoder:
. Ich sehe keine Methode, die ich überschreiben kann, die immer zuletzt genannt wird.
Dies ist die normale Reihenfolge der Methode aufruft:
- awakeFromNib
- viewDidLoad
- viewWillAppear
- viewDidAppear
Wenn Zustandswiederherstellung verwendet wird, dies wird als:
- awakeFromNib
- viewDidLoad
- decodeRestorableStateWithCoder
- viewWillAppear
- viewDidAppear
ich den Anruf nicht setupUI
in viewWillAppear
platzieren können, denn dann wäre es auch jedes Mal, wenn nativer wieder ausgeführt werden, um eine Sicht.
Es wäre viel handlicher, wenn decodeRestorableStateWithCoder
BEFORE viewDidLoad
genannt wurde, denn dann könnten Sie wiederhergestellte Eigenschaften verwenden. Leider ist das nicht der Fall, also ... wie kann ich verhindern, die Arbeit in viewDidLoad
zu tun, wenn ich weiß, dass ich es wieder in decodeRestorableStateWithCoder
direkt danach machen muss?
Ich würde einen Boolean auf NO in ViewDidLoad setzen, und wenn NEIN, dann Sachen in ViewWillAppear tun. Ich nehme an, du willst es nicht so machen? –
Könnte eigentlich die pragmatischste Lösung sein, ja. Es fühlt sich einfach "falsch" an :) –
@NitinAlabur Es gibt keinen Grund, den Wert für 'NO' in' viewDidLoad' zu setzen, da der 'BOOL'-Wert voreingestellt ist. – k06a