iOS - 嵌套推送动画可能导致导航栏损坏

时间:2014-01-13 09:08:24

标签: ios uiviewcontroller poptoviewcontroller

在我的应用程序中,我有UIViewControllers A,B,C,D。我做的是从A到B到C到D.现在堆栈读起来像A,B,C,D

然后我使用

删除C和D,它们是堆栈中的前2项
[self.navigationController popToViewController:BViewController animated:NO];

当我在NSLog时,我在堆栈中有A,B。现在,当我尝试移动到C时,我得到“嵌套推送动画可能导致导航栏损坏”。我很困惑为什么会这样。任何人都可以帮我解决这个问题。谢谢你的时间

修改 从B我使用以下代码转到C

UIStoryboard *storybord = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *viewController = [storybord instantiateViewControllerWithIdentifier:@"C"];
[self.navigationController pushViewController:viewController animated:YES];

执行此代码后,会有一个异步代码,我们将其推送到D

UIStoryboard *storybord = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *viewController = [storybord instantiateViewControllerWithIdentifier:@"D"];
[self.navigationController pushViewController:viewController animated:YES];

现在堆栈读取A,B,C,D。当我弹出时,问题就出现了

异步代码

 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

            if (error) {
                NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
                [defaults setValue:@"messagehomescreen" forKey:@"lastscreenstatus"];
                UIStoryboard *storybord = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
                UIViewController *viewController = [storybord instantiateViewControllerWithIdentifier:@"D"];
                [self.navigationController pushViewController:viewController animated:YES];

            } 
        }];

2 个答案:

答案 0 :(得分:2)

我认为您的问题是您正在异步推送到新的ViewController。

您无法在后台线程中执行任何UI操作。它必须都在主线程中。

如果你在后台运行可能需要很长时间然后推送到新视图控制器的东西,那么你必须总是回到主线程来推动视图控制器。

答案 1 :(得分:-1)

尝试

BViewController *BViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"BVC"];
[self.navigationController pushViewController: BViewController animated:YES];

编辑:是 - pushviewcontroller会将控制器添加到堆栈中。请不要使用它。

- popToViewController用于在堆栈中弹出视图控制器,直到已存在的控制器。但是您在堆栈上有一组视图控制器,因此您需要提供其中一个作为参数,如下面的代码。

 [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];

请参阅此link以获取更多信息。