swift-自定义导航栏返回事件(不修改导航栏按钮UI)

一、通过拓展来自定义导航栏返回事件
  由于不同的机型其原生返回按钮存在差异化,若对部分按钮进行重写,则需要对不同机型进行不同的适配,否则不能很好的匹配,介于过于繁琐,所以使用对导航栏协议扩展的方式,进行自定义导航栏返回事件。

func navigationBar(_navigationBar:UINavigationBar, didPop item:UINavigationItem) ->Bool

该函数用于判断是否执行返回,对需要自定义返回的特定控制器设置为无法执行返回,并添加自定义返回事件,从而达到重写返回事件的。

extension UINavigationController: UINavigationBarDelegate {
    public func navigationBar(_ navigationBar: UINavigationBar, didPop item: UINavigationItem) -> Bool {
        //获取导航栏中所有控制器
        let vcArray = self.viewControllers
        //安全保护
        guard vcArray.last != nil else{return false}
        //根据当前控制器,控制器顺序: ViewController -> SecondViewController ->ThirdViewController
        switch vcArray.last! {
        case is SecondViewController:
            return true
        case is ThirdViewController:
            //查找对应的需要跳转的控制器
            for one in vcArray where type(of: one) == ViewController.self {
                self.popToViewController(one, animated: true)
                return false
            }
            //未找到指定跳转控制器则直接返回
            return true
        default:
            return true
        }
    }
}

二、注意事项:
1.修改返回按钮的标题需要在对应控制器的前一个控制器进行设置,而不是在对应的控制器中修改。

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .done, target: self, action: nil)

2.由于是对所有的导航栏控制器进行拓展,故如果需要对多个控制器自定义返回事件,必须都写在同一个拓展中。

你可能感兴趣的:(swift-自定义导航栏返回事件(不修改导航栏按钮UI))