提出一个控制器解雇它并在Swift中呈现一个不同的控制器

rav*_*inx 14 ios presentviewcontroller swift swift3

所以我有一个根视图控制器,当用户按下它时会有一个按钮呈现另一个视图控制器.这个第二个控制器有一个关闭选项,它只返回到根视图控制器,当用户触摸它时,它会关闭当前视图控制器,因此它会返回到根视图控制器一秒钟并呈现另一个控制器.去我使用的第一个控制器:

let vc = FirstController()
self.present(vc, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)

当在另一个视图控制器中时,我选择只关闭的按钮我这样做.

self.dismiss(animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)

因此,对于需要解雇并呈现另一个的第二个控制器,我尝试了以下内容:

self.dismiss(animated: true, completion: {
            let vc = SecondController()
            self.present(vc, animated: true, completion: nil)
        })
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:

Warning: Attempt to present <UINavigationController: 0xa40c790> on <IIViewDeckController: 0xa843000> whose view is not in the window hierarchy!
Run Code Online (Sandbox Code Playgroud)

Mik*_*rne 45

发生此错误的原因是您在解除FirstController后尝试从FirstController呈现SecondController.这不起作用:

self.dismiss(animated: true, completion: {
    let vc = SecondController()

    // 'self' refers to FirstController, but you have just dismissed
    //  FirstController! It's no longer in the view hierarchy!
    self.present(vc, animated: true, completion: nil)
})
Run Code Online (Sandbox Code Playgroud)

这个问题与我昨天回答的问题非常相似.

为您的方案修改,我会建议:

weak var pvc = self.presentingViewController

self.dismiss(animated: true, completion: {
    let vc = SecondController()
    pvc?.present(vc, animated: true, completion: nil)
})
Run Code Online (Sandbox Code Playgroud)

  • 我们如何才能推送新的控制器而不会在 UI 中出现闪烁/闪烁,如何才能使过渡平滑? (2认同)