Swift:在解雇的完成处理程序中呈现 VC

Posted

技术标签:

【中文标题】Swift:在解雇的完成处理程序中呈现 VC【英文标题】:Swift: Presenting VC in completion handler of dismissal 【发布时间】:2020-01-12 23:02:45 【问题描述】:

我有以下 ViewController (VC) 流程:

SplashScreen/launch VC -> Login VC (on notification, present) -> SplashScreenVC -> Main VC

我想避免使用 unwind segue,因为无论当前的 VC 如何,我都需要定期重新验证用户身份,因此更愿意以编程方式“呈现”。

问题是,我可以展示和关闭 SplashScreen VC(它最初是根目录),但不能在没有错误的情况下对 Login VC 执行相同操作。

代码:

//in SplashScreen VC viewDidAppear

let loginVC = myStoryboard.instantiateViewController(identifier: "loginVC") as UIViewController
        loginVC.modalPresentationStyle = .fullScreen
        loginVC.modalTransitionStyle = .coverVertical

        //dismissal?
        self.dismiss(animated: true, completion: 
            self.present(loginVC, animated: true, completion: nil)
        )


//in loginVC selector function
let launchVC = myStoryboard.instantiateViewController(identifier: "launchVC") as UIViewController
        launchVC.modalPresentationStyle = .fullScreen
        launchVC.modalTransitionStyle = .coverVertical

        //check for top view controller (debugging)
        print("TOPVC at LoginVC: \(self.getTopVC()!)")

        //handle dismissal?
        self.dismiss(animated: true, completion: 
            self.present(launchVC, animated: true, completion: nil)
        )

警告:

Warning: Attempt to present <Slidr.LaunchScreenViewController: 0x15be0ef90> on <Slidr.LoginViewController: 0x15be6b510> whose view is not in the window hierarchy!

Warning: Attempt to present <Slidr.TestingViewController: 0x15db00ac0> on <Slidr.LaunchScreenViewController: 0x15bd06960> whose view is not in the window hierarchy!

如果我不关闭 loginVC,代码运行良好,但我想随着时间的推移避免残留控制器。

我试图从*** VC 而不是“自我”展示,但这似乎并没有改变任何东西。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

正如错误所说,您需要从当前被解雇的 1 中提供一个 vc,所以改为这样做

self.dismiss(animated: true, completion: 
   (UIApplication.shared.delegate as! AppDelegate).window?.rootViewController = loginVC

另一种方法是将rootVC嵌入navigationController并执行

self.navigationController?.setViewControlls([loginVC],animated:true)

【讨论】:

第一个解决方案似乎对我不起作用。我遇到了以下错误```由于未捕获的异常'NSInternalInconsistencyException'而在后台线程上调用UI API,原因:'线程冲突:预期主线程'``` 是的,对不起,我太傻了——忘了你只能在主线程上更新 UI。旁注 - 有没有办法为第一个解决方案设置动画?不太可能,但那将是理想的

以上是关于Swift:在解雇的完成处理程序中呈现 VC的主要内容,如果未能解决你的问题,请参考以下文章

我怎样才能解雇第二个在第一个 vc 上模态呈现的第一个 vc

如何使用 Swift 完成处理程序的结果?

在 Swift 中向 UIViewPropertyAnimator 添加完成处理程序

下载图像后触发collectionView重新加载的完成处理程序-Xcode [SWIFT]

Swift - 解雇后的popViewController

所有呈现的视图控制器都不会被解雇