如何检查视图控制器是不是已在 Swift 中关闭

Posted

技术标签:

【中文标题】如何检查视图控制器是不是已在 Swift 中关闭【英文标题】:How to check if a view controller has been dismissed in Swift如何检查视图控制器是否已在 Swift 中关闭 【发布时间】:2021-01-15 14:54:23 【问题描述】:

如果我像这样呈现ViewController

let authViewController = authUI!.authViewController()
authViewController.modalPresentationStyle = .overCurrentContext
self.present(authViewController, animated: true, completion: nil)

我想知道ViewController 何时被解雇。我尝试了以下方法:

let authViewController = authUI!.authViewController()
authViewController.modalPresentationStyle = .overCurrentContext
self.present(authViewController, animated: true, completion: 
   print("View Dismissed")
)

但这只会让我知道视图是否成功呈现。这个ViewController 不是我创建的,所以我无法更改viewWillDissapear 方法。

【问题讨论】:

如果您无权访问authViewController 代码,最简单的解决方案是使用您的视图控制器的viewWillAppear 来查找何时关闭身份验证视图控制器。基本上,当您在现有视图控制器上呈现/推送任何视图控制器时,视图控制器的 viewWillDisappear 将在呈现/推送的视图控制器被关闭或弹出viewWillAppear 时被调用。 【参考方案1】:

整个答案基于 OP 无权访问 authViewController 代码的假设

如果您无权访问authViewController 代码,糟糕的解决方案是使用您的视图控制器的viewWillAppear 来查找何时关闭身份验证视图控制器。

基本上,当您在现有视图控制器上展示/推送任何 viewController 时,您的视图控制器的 viewWillDisappear 将在呈现/推送的视图控制器被关闭时以类似方式调用,或者将调用弹出的 viewWillAppear

因为viewWillAppear 也可能因其他原因而被调用,并且您不想将其与authViewController 驳回混淆,请使用布尔值

private var shouldMonitorAuthViewControllerDismiss = false //declared a instance property

当您实际呈现 authViewController 时,将布尔值设置为 true

let authViewController = authUI!.authViewController()
authViewController.modalPresentationStyle = .overCurrentContext
self.present(authViewController, animated: true, completion: 
    shouldMonitorAuthViewControllerDismiss = true
)

终于在你的viewWillAppear

    override func viewWillAppear(_ animated: Bool) 
        super.viewWillAppear(true)
        if shouldMonitorAuthViewControllerDismiss 
            //auth view controller is dismissed
        
        shouldMonitorAuthViewControllerDismiss = false
    

【讨论】:

我尝试了这个解决方案,但似乎viewWillAppearauthViewController 被解雇后没有运行。对于上下文 authViewController 来自 FirebaseUI 库。 @david: 你可以试试modalPresentationStyle = .fullScreen ?? @david: TBH 不,它不是 :) 如果你真的需要 . fullScreen. overCurrentContext. fullScreen 之间是有区别的:) 仅供参考,这是一个糟糕的解决方案,因为您知道您无权访问呈现视图控制器 :) 如果您可以修改 authViewController 代码,更好的方法是进行 unwind segue 或设置协议或设置回调(闭包) :) + 1 你的问题也是:) 我不需要它是.overCurrentContext,这个解决方案使它不理想怎么办? @david:这是你现在能做的最好的事情 :) 因为你无权访问 AuthViewController 代码,如果它是你自己的 VC,我建议添加 1. Unwind segue 或 2. 有协议并委托设置 3.Callbacks(闭包)来传达解雇,这样您的代码变得可重用和模块化 :) 如果这是您自己的 VC,但您执行此解决方案,它显然可以工作,但看起来像黑客不是吗?很多人使用这样的技巧,但最后它对我个人来说只是一个 hack

以上是关于如何检查视图控制器是不是已在 Swift 中关闭的主要内容,如果未能解决你的问题,请参考以下文章

检查用户是不是已在 Swift 中注册本地通知时出错

Firebase Auth 和 Swift:检查电子邮件是不是已在数据库中

如何检查是不是已在 Ruby 和 Windows 控制台中按下箭头键

检查用户是不是点击了外部视图控制器

如何检查重用标识符是不是已在 UITableView 中注册?

firebase 在 Swift 中关闭重载表?