推动多个控制器时,布局出现问题,没有动画。

3
所以我有一个由三个UITableViewControllers组成的堆栈,每个都可以正确地在导航栏下面显示其视图,当我通过UI手动切换时。

但现在我正在进行应用程序重启后恢复状态的工作,因此我会在主线程中的同一个方法中依次将相同的两个控制器推到根视图控制器之上。然后发生的情况是中间控制器的视图布局过于向下,而顶部控制器的视图则太高(位于导航栏下面)。

相关代码:

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刷新过程发生,因为它们发生在同一个线程中。看起来好像应该影响顶级控制器的自动视图调整会影响到中间的控制器。
如果是这样,我该怎么办呢?因为我确实希望所有状态恢复都能在应用程序启动时立即进行。
编辑:看起来我的表述不太清楚。restoreNextViewController:是一个MyViewController子类方法,根据存储的键恢复控制器的状态,然后使用[self.navigationController pushViewController:foo animated:NO]推送适当的子控制器。我这样做是因为我的实际应用程序与这个简化情况不同,在堆栈中有多达6个控制器,并且它们并不总是相同的。所以我觉得这比沿着堆栈检查控制器的类更加清晰。每个控制器已经知道如何在用户输入后推送一个子控制器;为什么不在应用程序重新启动时重用它呢?
我没有遇到任何显示控制器的问题;它们只是被奇怪地布局了。
4个回答

1
你有没有考虑在每个视图控制器的 viewWillAppear: 方法中推送其子视图控制器?我会在 appDelegate 中设置一个 isRestoringState 属性,并在 viewWillAppear: 方法中检查它,如果已设置,则运行该视图的还原操作,包括推送任何可见的子视图。类似这样的代码:

- (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];
        }
    }
}

0

我同意Rob的观点,当你的应用程序被加载时,可以考虑实现UINavigationController。然后,您可以按照所需的顺序将每个控制器推送到UINavigtionController中以形成层次结构。

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated

所以,如果你知道你想要将应用程序恢复到的状态,你可以加载适当的ViewController系列,并将它们推送到NavigationController上。

UIViewController *myViewController = [[UIViewController alloc] initWithNibName:@"myView" bundle:nil];
[navigationController pushViewController:myViewController animated:NO];

如果你想要“弹回”到UIViewController,用户可以免费按导航栏上的“返回”按钮。或者你可以使用导航控制。

- (UIViewController *)popViewControllerAnimated:(BOOL)animated

eg [[self navigationController] popViewControllerAnimated:NO];

如果您想自己控制推送/弹出,您也可以控制是否要显示NavigationBar。希望我已经解释得足够清楚了,我最近刚走过这条路。


0

您可以多次调用pushViewController:animated:方法。请发布-restoreNextViewController的代码。为什么这段代码如此复杂令人困惑呢?您是否阅读了视图控制器指南中创建导航控制器一节?他们介绍了在启动时将视图控制器推入堆栈的方法。


我没有任何问题让控制器出现;它们只是被错误地布局了。请看我编辑后的问题。 - lawrence

0

在每个表视图的控制器的 viewWillAppear: 方法中,我最终手动重置了每个表视图的内容插入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接