İşte @oneway'in gezinme çubuğu geri düğmesi olayını tetiklenmeden önce yakalamak için yanıtının Swift 3 sürümü . As UINavigationBarDelegate
için kullanılamaz UIViewController
, ne zaman tetiklenecek bir temsilci oluşturmak için gereken navigationBar
shouldPop
denir.
@objc public protocol BackButtonDelegate {
@objc optional func navigationShouldPopOnBackButton() -> Bool
}
extension UINavigationController: UINavigationBarDelegate {
public func navigationBar(_ navigationBar: UINavigationBar, shouldPop item: UINavigationItem) -> Bool {
if viewControllers.count < (navigationBar.items?.count)! {
return true
}
var shouldPop = true
let vc = self.topViewController
if vc.responds(to: #selector(vc.navigationShouldPopOnBackButton)) {
shouldPop = vc.navigationShouldPopOnBackButton()
}
if shouldPop {
DispatchQueue.main.async {
self.popViewController(animated: true)
}
} else {
for subView in navigationBar.subviews {
if(0 < subView.alpha && subView.alpha < 1) {
UIView.animate(withDuration: 0.25, animations: {
subView.alpha = 1
})
}
}
}
return false
}
}
Ardından, görünüm denetleyicinize temsilci işlevini ekleyin:
class BaseVC: UIViewController, BackButtonDelegate {
func navigationShouldPopOnBackButton() -> Bool {
if ... {
return true
} else {
return false
}
}
}
Kullanıcıların geri dönmek isteyip istemediklerine karar vermek için sık sık bir uyarı denetleyicisi eklemek istediğimizi fark ettim. Her zaman can Eğer öyleyse return false
içinde navigationShouldPopOnBackButton()
işlev ve böyle bir şey yaparak görünüm denetleyicisi kapatmak:
func navigationShouldPopOnBackButton() -> Bool {
let alert = UIAlertController(title: "Warning",
message: "Do you want to quit?",
preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Yes", style: .default, handler: { UIAlertAction in self.yes()}))
alert.addAction(UIAlertAction(title: "No", style: .cancel, handler: { UIAlertAction in self.no()}))
present(alert, animated: true, completion: nil)
return false
}
func yes() {
print("yes")
DispatchQueue.main.async {
_ = self.navigationController?.popViewController(animated: true)
}
}
func no() {
print("no")
}