一、通过拓展来自定义导航栏返回事件
由于不同的机型其原生返回按钮存在差异化,若对部分按钮进行重写,则需要对不同机型进行不同的适配,否则不能很好的匹配,介于过于繁琐,所以使用对导航栏协议扩展的方式,进行自定义导航栏返回事件。
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.由于是对所有的导航栏控制器进行拓展,故如果需要对多个控制器自定义返回事件,必须都写在同一个拓展中。