Also habe ich einen Stapel von drei UITableViewControllern, von denen jeder seine Sicht korrekt unter der Navigationsleiste anzeigt, wenn ich manuell durch die Benutzeroberfläche tappe.Layout verschraubt, wenn ich mehrere Controller ohne Animation stoße
Allerdings arbeite ich an der Wiederherstellung des Status über App-Neustart, und so schiebe ich die gleichen zwei Controller auf dem Root-View-Controller, einzeln, in der gleichen Methode im Haupt-Thread. Was dann passiert, ist, dass die Ansicht des mittleren Controllers zu weit nach unten gerichtet ist und die Ansicht des obersten Controllers zu weit oben ist (unterhalb der Navigationsleiste).
Relevante Code:
for (int i = 0; i < [controllerState count]-1; i++) {
MyViewController* top = (MyViewController*)navigationController.topViewController;
int key = [[controllerState objectAtIndex:i] integerValue];
[top restoreNextViewController:key]; // this calls pushViewController:
// so top will be different in the next iteration
}
Ich vermute, dass das Problem ist, dass ich nicht einig wichtiger UI Refresh-Prozess stattfinden kann zwischen den beiden Schüben, weil sie im selben Thread passieren. Es sieht fast so aus, als ob die automatische Ansichtsanpassung, die den oberen Controller beeinflussen soll, stattdessen den mittleren beeinflusst.
Ist das richtig? Und wenn ja, was sollte ich tun, da ich möchte, dass die Wiederherstellung des Zustands sofort nach dem Start der App stattfindet?
EDIT: sieht aus wie ich war unklar. restoreNextViewController:
ist eine MyViewController-Unterklassenmethode, die den Status des Controllers basierend auf einem gespeicherten Schlüssel wiederherstellt und dann den entsprechenden untergeordneten Controller mit [self.navigationController pushViewController:foo animated:NO]
verschiebt. Ich mache das, weil meine eigentliche App, im Gegensatz zu diesem vereinfachten Fall, bis zu 6 Controller im Stack hat, und sie sind nicht immer die gleichen. Also dachte ich mir, das wäre ein saubereres Design, als den Stack runter zu gehen und die Klassen der Controller zu überprüfen. Jeder Controller weiß bereits, wie er als Reaktion auf Benutzereingaben einen Kindcontroller anstößt. Warum nicht das beim Neustart der App wiederverwenden?
Ich habe keine Probleme, die Controller zu zeigen; sie werden nur seltsam ausgelegt.
Ich habe keine Probleme, die Controller zu zeigen; Sie werden nur falsch ausgelegt. Siehe meine bearbeitete Frage. – lawrence