所以我有一个由三个 UITableViewController 组成的堆栈,当我手动点击 UI 时,每个 Controller 都会在导航栏下方正确显示其 View 。
但是,现在我正在努力在应用程序重新启动时恢复状态,因此我将相同的两个 Controller 推送到 Root View Controller 顶部,一次一个,在主线程中使用相同的方法。最终发生的情况是中间 Controller 的 View 布置得太靠下,而顶部 Controller 的 View 布置得太靠上(导航栏下方)。
相关代码:
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
}
我怀疑问题是我不允许在两次推送之间发生一些重要的 UI 刷新过程,因为它们发生在同一个线程中。它几乎看起来好像应该影响顶部 Controller 的自动 View 调整会影响中间的 Controller 。
是吗?如果是这样,我应该做什么,因为我确实希望所有状态恢复在应用程序启动时立即进行?
编辑:看起来我不清楚。 restoreNextViewController:
是 MyViewController 子类方法,它根据存储的键恢复 Controller 的状态,然后使用 [self.navigationController pushViewController:foo animated:NO]
推送适当的子 Controller 。 。我这样做是因为我的实际应用程序与这个简化的情况不同,堆栈中最多有 6 个 Controller ,而且它们并不总是相同的。所以我认为这将是一个比向下检查 Controller 类更干净的设计。每个 Controller 已经知道如何推送子 Controller 来响应用户输入;为什么不在应用程序重新启动时重用它?
我在让 Controller 显示时没有遇到任何问题;它们只是排列得很奇怪。
最佳答案
您是否考虑过让每个 View Controller 在 viewWillAppear:
期间推送其 subview ?我只需在您的 appDelegate 中设置一个 isRestoringState
属性,并在 viewWillAppear:
期间检查是否已设置,如果已设置,则运行该 View 的恢复,包括推送任何可见的 subview 。像这样的东西:
- (void)viewWillAppear:(BOOL)animated {
if ([[UIApplication sharedApplication] isRestoringState]) {
// restore local state, set myChildController if a child is visible
if (myChildController) {
[self.navigationController pushViewController:myChildController animated:NO];
}
}
}
关于iphone - 当我在没有动画的情况下插入多个 Controller 时,布局出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/913171/