นี่คือคำตอบของ@onewayรุ่น Swift 3 สำหรับการจับปุ่มย้อนกลับของแถบนำทางเหตุการณ์ก่อนที่จะถูกไล่ออก เนื่องจากUINavigationBarDelegate
ไม่สามารถใช้งานได้UIViewController
คุณจะต้องสร้างผู้รับมอบสิทธิ์ที่จะถูกเรียกใช้เมื่อnavigationBar
shouldPop
มีการโทร
@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
}
}
จากนั้นในตัวควบคุมมุมมองของคุณเพิ่มฟังก์ชันผู้แทน:
class BaseVC: UIViewController, BackButtonDelegate {
func navigationShouldPopOnBackButton() -> Bool {
if ... {
return true
} else {
return false
}
}
}
ฉันรู้ว่าเรามักจะต้องการเพิ่มตัวควบคุมการแจ้งเตือนสำหรับผู้ใช้ในการตัดสินใจว่าพวกเขาต้องการที่จะกลับไป ถ้าเป็นเช่นนั้นคุณจะสามารถreturn false
ในnavigationShouldPopOnBackButton()
การทำงานและปิดควบคุมมุมมองของคุณด้วยการทำอะไรเช่นนี้
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")
}