iOS:关闭视图控制器并推送新视图,而不显示导航堆栈中的当前视图

时间:2016-03-07 09:30:09

标签: ios objective-c swift uinavigationcontroller presentmodalviewcontroller

我有一个导航控制器堆栈,里面有不同的控制器。

我想以模式方式呈现一个视图控制器,当我根据下一个视图需要它时,我正在推送到导航控制器。 (您可以将其视为用户登录验证屏幕..在移动到下一个屏幕之前验证用户。)

我可以用

成功完成
UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(contactPicker, animated: true, completion: nil)

并在我需要解雇

时将其解雇
UIApplication.sharedApplication().keyWindow?.rootViewController?.dismissViewControllerAnimated(false, completion: {
        self.navigationController.pushViewController(myNewVC, animated: true)
    })

我能够做到这一点,但是从模态呈现视图到我的(myNewvC)新推送到下一个视图的过渡并不是我想要的。当视图解除时,我可以在移动到下一个视图之前看到我的调用者屏幕一秒钟。我不想看到那个屏幕。有可能吗?

(另外,我不想在导航堆栈中添加验证屏幕,因为该屏幕的目的不是导航堆栈的一部分)。

2 个答案:

答案 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