检查弹出的 UIViewController 是不是被滑动关闭

Posted

技术标签:

【中文标题】检查弹出的 UIViewController 是不是被滑动关闭【英文标题】:Check if Popped UIViewController gets dismissed by swipe检查弹出的 UIViewController 是否被滑动关闭 【发布时间】:2022-01-23 01:41:44 【问题描述】:

我想检查用户何时将弹出的 viewController 滑开。因此,例如,当在 WhatsApp 中,用户通过从边缘滑动退出当前聊天。这在 Swift 中怎么可能?

我不想使用 viewDidDisappear,因为当另一个 viewController 出现在当前 viewController 上时,也会调用此方法。

【问题讨论】:

也许你可以检查viewDidDisappear中的navigationController是否为nil;这可能是一个解决方案,但不确定多少适合您的场景 非常感谢。它完美地工作。如果您愿意,可以将此评论添加为问题,我会将其标记为正确。 谢谢,我放了 【参考方案1】:

正如我在评论中所写,一个简单的解决方法是在viewDidDisappear,检查navigationController 是否为nil

class MyVc: UIViewController 

    override func viewDidDisappear(_ animated: Bool) 
        super.viewDidDisappear(animated)

        if navigationController == nil 
            print("view controller has been popped")
        
    


当然,这个解决方案只有在视图控制器嵌入导航控制器时才有效,否则 if 语句将始终为true

【讨论】:

当堆栈上有多个 UIViewControllers 时,这将不起作用 - 对吧?只有当它是你刷掉的最后一个 VC。【参考方案2】:

这种“滑动”由UINavigationControllerinteractivePopGestureRecognizer 处理。可以将此手势识别器的委托设置为您的UIViewController,如下所示:

navigationController?.interactivePopGestureRecognizer?.delegate = self

然后,您可以在您的UIViewController 中实现UIGestureRecognizerDelegate。这看起来像这样:

extension YourViewController: UIGestureRecognizerDelegate 
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool 
        guard gestureRecognizer.isEqual(self.navigationController?.interactivePopGestureRecognizer) else  return true 
        
        print("The interactive pop gesture recognizer is being called.")
        return true
    

我还没有测试过代码,但是每次使用 interactivePopGestureRecognizer 时都会打印出来。

有关详细信息,请参阅interactivePopGestureRecognizer 和UIGestureRecognizerDelegate 的文档。

【讨论】:

以上是关于检查弹出的 UIViewController 是不是被滑动关闭的主要内容,如果未能解决你的问题,请参考以下文章

如何检查当前是不是正在显示 UIViewController?

在 UIViewController 中为弹出式键盘设置 UIView 的最佳方式是啥?

UIViewController 没有被释放

UIViewController 的委托函数决定弹出

如何在Android中判断软键盘是不是弹出或隐藏

判断 UIViewController 子类的实例是不是存在