我有一个导航控制器堆栈,里面有不同的控制器。
我想以模式方式呈现一个视图控制器,当我根据下一个视图需要它时,我正在推送到导航控制器。 (您可以将其视为用户登录验证屏幕..在移动到下一个屏幕之前验证用户。)
我可以用
成功完成UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(contactPicker, animated: true, completion: nil)
并在我需要解雇
时将其解雇UIApplication.sharedApplication().keyWindow?.rootViewController?.dismissViewControllerAnimated(false, completion: {
self.navigationController.pushViewController(myNewVC, animated: true)
})
我能够做到这一点,但是从模态呈现视图到我的(myNewvC)新推送到下一个视图的过渡并不是我想要的。当视图解除时,我可以在移动到下一个视图之前看到我的调用者屏幕一秒钟。我不想看到那个屏幕。有可能吗?
(另外,我不想在导航堆栈中添加验证屏幕,因为该屏幕的目的不是导航堆栈的一部分)。
答案 0 :(得分:0)
Apple完全添加完成块以保护您免受未捕获的异常,因为您想要做的事情可能导致一个,因为您无法同时执行两个动画,可能是一些建议的解决方案:
尝试呈现新控制器然后在完成时隐藏完成块中的前一个控制器(这样当用户解除新控制器时,他将看不到前一个控制器),例如, 假设您现在在VC1中,并且想要关闭它并显示VC2,您可以在objective-c中使用以下代码
[self presentViewController:VC2 animated:YES completion:^{
[self dismissViewControllerAnimated:YES completion:nil];
}];
在swift中
self.presentViewController(VC2, animated: true) { () -> Void in
self.dismissViewControllerAnimated(true, completion: nil)
}
或者你可以忽略它,如果用户不会关闭新的控制器,那么他永远不会看到旧的控制器,但我不认为这是内存效率,因为控制器会卡在内存中。
答案 1 :(得分:0)
我自己没有尝试过但是如果你使用UINavigationViewController并且你只是不想回到那个ViewController,那么在你去下一个ViewController之后你可以简单地从堆栈中删除它。 在这里,您可以看到如何更改UINavigationViewController的ViewController数组: Removing viewcontrollers from navigation stack