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

iOS嵌套推送动画可能导致导航栏损坏,ios,uiviewcontroller,poptoviewcontroller,Ios,Uiviewcontroller,Poptoviewcontroller,在我的应用程序中,我有UIViewController A、B、C、D。我所做的是从A到B再到C再到D。现在堆栈读起来像A、B、C、D 然后,我使用 [self.navigationController popToViewController:BViewController animated:NO]; 当我现在登录时,堆栈中有A,B。现在,当我尝试移动到C时,我得到“嵌套推送动画可能会导致导航栏损坏”。我不明白为什么会发生这种情况。谁能帮我解决这个问题。谢谢你的时间 编辑 从B到C使用下面的代

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

然后,我使用

[self.navigationController popToViewController:BViewController animated:NO];
当我现在登录时,堆栈中有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];

            } 
        }];
试一试

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

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

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

请参阅此以了解更多信息。

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

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


如果您在后台运行某个可能需要很长时间的程序,然后将其推送到新的视图控制器,则必须始终返回主线程以推送视图控制器。

对于(UIViewController*aViewController在所有ViewController中){If([aViewController isKindOfClass:[messageViewController class]]{UIViewController*myViewController=[self.storyboard实例化EvewController WithiIdentifier:@“messageview”];[self.navigationController popToViewController:myViewController动画:是];}这给了我一个错误-试图弹出到一个不存在的视图控制器。“你能帮我一下吗请使用[self.navigationController pushViewController:BViewController animated:YES];它将代替popToViewController工作。请看上面的答案。只要一个基本问题,如果我错了,请纠正我。pushViewController是否将视图控制器添加到堆栈。或者我用PopToVcontroller做错事了。谢谢你使用了正确的方法返回到B控制器(据我所知)。请你把代码从B推到C,好吗。。。异步是什么意思?请显示异步推送的所有代码。@Fogmeister您是正确的,我已经编辑了代码以使用popToViewController动画。您在哪里运行异步连接?是从C的角度看的吗?另外,回拨发生的速度有多快?错误会立即出现吗?如果是这样,您可能仍处于上一个过渡的动画中。您最好将它放在C的
viewdide
中,而不是
viewdideload
@Timothy Rajan您在哪里调用sendAsynchronousRequest代码?用哪种方法?viewDidLoad或VIEWWILL出现?谢谢您的回答。你能告诉我怎么做吗。我的想法是在异步代码中设置一个BOOL值,一旦异步代码被执行,根据主线程中的BOOL值推送视图控制器。我说的对吗?我还想知道,如果异步块中出现错误,为什么UIViewController堆栈的NSLog总是显示所需的结果。知道吗?不,你的代码已经回到主线程上了。这可能是因为转换运行了两次,或者在前一个转换仍在进行时调用了它。将
NSLog
放入代码中,查看它被调用了多少次。I NSLoged。当我点击button@TimothyRajan你有一个故事板序列连接到按钮吗?
 [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];