iOS 左滑返回拦截方案

在 iOS 应用开发中,左滑返回手势提供了方便的导航功能,但是在某些场景下,我们可能需要拦截这个手势,比如在某些重要的操作中用户需要确认是否返回。本文将介绍如何拦截 iOS 中的左滑返回手势,并提供相关代码示例。

拦截左滑返回的基本思路

要拦截左滑返回,我们可以通过重写 UINavigationController 的某些方法来完成。具体而言,我们需要实现以下两步:

  1. 重写 navigationControllerinteractivePopGestureRecognizer 的委托方法。
  2. 在合适的时机提供一个提示给用户,询问他们是否确认返回。

示例代码

下面的代码展示了如何实现左滑返回拦截功能:

import UIKit

class CustomNavigationController: UINavigationController, UIGestureRecognizerDelegate {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.interactivePopGestureRecognizer?.delegate = self
    }
    
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        // 这里可以添加条件判断
        if let topViewController = self.topViewController {
            if topViewController is ConfirmBackViewController {
                // 如果是确认返回页面,拦截左滑返回
                showAlert()
                return false
            }
        }
        return true
    }
    
    func showAlert() {
        let alert = UIAlertController(title: "确认返回", message: "是否确认返回?", preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "取消", style: .cancel, handler: nil))
        alert.addAction(UIAlertAction(title: "确认", style: .default, handler: { _ in
            self.popViewController(animated: true)
        }))
        
        if let topViewController = self.topViewController {
            topViewController.present(alert, animated: true, completion: nil)
        }
    }
}

代码解析

  1. 自定义导航控制器:我们创建了一个继承 UINavigationController 的自定义类 CustomNavigationController,并重写了 viewDidLoad 方法来设置手势代理。

  2. 手势识别代理:在 gestureRecognizerShouldBegin 方法中,我们检查当前的最上层控制器,如果它是 ConfirmBackViewController(需要确认返回的页面),则调用 showAlert 弹出提示框,并返回 false 拦截手势。

  3. 弹出确认框showAlert 方法用于展示确认返回的警告框,用户可以选择取消或确认返回,确认后调用 popViewController 返回上一个页面。

类图

下面是此设计的类图,可以帮助更好地理解类之间的关系。

classDiagram
    class CustomNavigationController {
        -interactivePopGestureRecognizer : UIGestureRecognizer
        +viewDidLoad()
        +gestureRecognizerShouldBegin() : Bool
        +showAlert()
    }

    class ConfirmBackViewController {
    }

    CustomNavigationController --> ConfirmBackViewController : checks type for gesture

结尾

通过以上方法,我们成功实现了左滑返回拦截的功能。当用户在特定页面进行操作时,他们将收到确认提示,以防止意外返回。这种方法不仅能提升用户体验,还能有效地避免重要操作中出现的误操作。希望这篇文章能够帮助到开发者在进行 iOS 应用开发时更好地控制导航行为。