视图控制器不会立即关闭并呈现新的视图控制器

Posted

技术标签:

【中文标题】视图控制器不会立即关闭并呈现新的视图控制器【英文标题】:View Controller won't dismiss and present new view controller immediately 【发布时间】:2018-08-22 13:31:31 【问题描述】:

我正在尝试在 QRCode 阅读器被关闭后呈现一个视图控制器,但是在执行此操作时,QRCode 阅读器视图控制器会再次出现。下面的代码 sn-p 显示了方法以及我如何关闭视图以及我如何尝试呈现下一个视图控制器。关于为什么当我尝试呈现不同的控制器时 QR 阅读器视图控制器不断呈现自己的任何想法。

func readerDidCancel(_ reader: QRCodeReaderViewController) 
    dismiss(animated: true, completion: nil)
    present(ClockInOrOutViewController(), animated: true, completion: nil)

【问题讨论】:

你不能这样做。只有在前一个控制器完全关闭时,你才应该展示新的控制器。 @Vikky 你如何建议我这样做? 我认为 Konrad Piękoś 的回答会奏效。但它并没有像你评论的那样。所以现在你必须使用协议和代表来解决你的问题。看看medium.com/swift2go/…跨度> 【参考方案1】:

您必须在dismisscompletion 处理程序中调用present

func readerDidCancel(_ reader: QRCodeReaderViewController) 

    weak var presentingViewController = self.presentingViewController

    self.dismiss(animated: true, completion: 
        presentingViewController?.present(ClockInOrOutViewController(), animated: true, completion: nil)
    )

如果这不起作用,则意味着您的呈现视图控制器也已以某种方式被删除。 (解雇/弹出?)

【讨论】:

刚刚测试了您的解决方案,它给了我与我开始时相同的问题,并在调试器中抛出此错误' 其视图不在窗口层次结构中!' 我认为这行不通。你不能从一个正在消失的 ViewController 中呈现 @Vikky 你是对的,你需要一个显示当前视图控制器的实例。【参考方案2】:

当其他视图控制器正在解散时,您不能呈现视图控制器,也不能在解散视图控制器时呈现。 你可以这样做:

func readerDidCancel(_ reader: QRCodeReaderViewController) 
   let presenting = self.presentingViewController
   dismiss(animated: true, completion: 
      presenting?.present(ClockInOrOutViewController(), animated: true, completion: nil)
   ) 

【讨论】:

您的解决方案仍然返回我,我仍然有同样的错误。 ' 其视图不在窗口层次结构中!' 这取决于你如何呈现以前的视图控制器你也可以试试这个:func readerDidCancel(_ reader: QRCodeReaderViewController) dismiss(animated: true, completion: let presenting = UIApplication.sharedApplication().keyWindow?.rootViewController presenting?.present(ClockInOrOutViewController(), animated: true, completion: nil) )

以上是关于视图控制器不会立即关闭并呈现新的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

视图控制器不会立即呈现

iOS - 在关闭其他视图控制器后立即呈现视图控制器

如何关闭模态视图控制器,然后立即让呈现视图控制器呈现不同的模态视图控制器?

在呈现新视图控制器后关闭当前视图控制器 - swift

如何以编程方式弹出一个视图控制器并呈现一个新的

消除关闭视图控制器和呈现新视图控制器之间的延迟