检查 Popped UIViewController 是否被滑动解除

Check if Popped UIViewController gets dismissed by swipe

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

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

此“滑动”由 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 and UIGestureRecognizerDelegate 的文档。

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

class MyVc: UIViewController {

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

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

}

当然,这个解决方案只有在view controller嵌入到navigation controller中才有效,否则if语句总是true.