没有动画地在取消视图控制器之后立即显示视图控制器

3

我在屏幕上呈现了一个UIImagePickerController。当我选择需要的照片后,我需要关闭PickerController并立即显示另一个PhotoEditController。以下是我的代码:

picker.dismissViewControllerAnimated(false, completion: {
    self.presentViewController(editPhotoVC, animated: false, completion: nil)
})

在解除旧的VC和呈现新的VC之间,有一个0.1秒的闪光,所以presentingViewController(self)会显示出来。我该如何避免通过一种优雅的解决方案而不是通过黑客手段来解决呢?谢谢


2
既然您没有执行任何动画,为什么不直接呈现新的视图控制器而不消除之前的?如果您连续呈现多个视图控制器,从而构建一个已呈现视图控制器的堆栈,在堆栈较低的视图控制器上调用此方法会关闭其直接子视图控制器以及所有在该子视图控制器上方的视图控制器。当发生这种情况时,只有最上面的视图以动画方式被关闭; 任何中间的视图控制器都将从堆栈中删除。 - LLooggaann
怎么办?苹果不允许这样做。 - imObjCSwifting
抱歉,我的意思是在已经呈现的视图控制器(选择器)上呈现您的新视图控制器。然后,当您想要关闭它们时,请从最初呈现第一个视图控制器的原始视图控制器中关闭。 - LLooggaann
picker.dismissViewControllerAnimated 是正确的吗?不应该只是 dismissViewControllerAnimated 吗? - HMHero
@LLooggaann 我明白你的意思了。那实际上就是我所实现的。我在self上实现了一个从editPhotoVC回调的委托,以便一起关闭两个视图控制器。你可以写一个答案,我会标记为已解决。 - imObjCSwifting
3个回答

1
实现的标准方式是使用动画关闭第一个视图控制器(VC),并使用动画呈现第二个VC。但是,根据您的视图层次结构,您也可以先加载第二个VC,然后在其上方呈现第一个VC。这样,简单地不带动画关闭第一个VC应该会在没有延迟的情况下显示在第二个VC下面。第三种方法是,像LLooggaann建议的那样,不要关闭第一个VC,只需呈现第二个VC。一旦完成,一次性关闭整个视图控制器层次结构。

0

这很可能是因为 dismiss 被发送到了呈现选择器的 VC,它会关闭选择器模态 VC 并在尝试呈现父级 VC(即自身)后执行完成处理程序。 一个解决方案是创建自己的转换类,你可以基本上从 这里 复制粘贴代码来实现


0
你可以实例化PhotoEditController,然后像这样做:
instance.willMoveToParentViewController(controllerThatPresentsPicker)
controllerThatPresentsPicker.addChildViewController(instance)
controllerThatPresentsPicker.view.insertSubview(instance.view, belowSubview: picker.view)
instance.didMoveToParentViewController(controllerThatPresentsPicker)

虽然看起来有点像黑客攻击


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