导航栏的默认返回行为不起作用
Navigation Bar's Default behaviour to go back is not working
我有一个视图控制器,我需要在其中添加自定义后退按钮。所以我添加了一个自定义 backButtonItem
。但是在添加自定义后退按钮后,我的视图控制器通过滑动返回的默认行为停止按预期工作。
如果我从视图控制器中删除自定义后退按钮,视图控制器的行为符合预期,但一旦我添加自定义后退按钮,默认行为就会停止。
我已经添加了这样的自定义后退按钮
self.navigationItem.leftBarButtonItem = getCustomBackBarButtonItem(viewController: self)
我曾尝试使用 backBarButtonItem
而不是 leftBarButtonItem
,但这样做后自定义后退按钮不会出现,并且视图控制器的行为符合预期。
如果我删除上面的代码,视图控制器的行为就如预期的那样,它可以通过滑动顺利返回。
一定要像这样构建 UIBarButtonItem:
let customBack = UIBarButtonItem(title: "Back", style:.done, target:self, action: #selector(self.letsGoBack))
然后实现弹回功能:
@objc func letsGoBack() {
self.navigationController?.popViewController(animated: true)
}
所以最后就是:
self.navigationItem.leftBarButtonItem = customBack
如果您想保留向后滑动手势,您可以将导航控制器子类化:
class YourNavigationController: UINavigationController, UIGestureRecognizerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
self.interactivePopGestureRecognizer?.delegate = self
}
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return self.viewControllers.count > 1
}
}
返回上一个 viewController
初始化 UIBarButton
var backBtn:UIBarButtonItem!
将 UIBarButton 添加到 NavigationBar
backBtn = UIBarButtonItem(title: "Go-Back" , style: .plain, target: self, action: #selector(self.backBtnClicked(_:)))
self.navigationItem.leftBarButtonItem = backBtn
将此功能添加到您的 class
func backBtnClicked(_ sender:UIBarButtonItem) {
if let redirect = self.navigationController?.popViewController(animated: true) {
// If you open this viewController by using pushViewController this will called
} else {
self.dismiss(animated: true, completion: nil)
// If you open this viewController by using present this will called
}
}
希望对您有所帮助
您可以简单地添加以下行,而不是将委托设置为自己:
self.navigationController?.interactivePopGestureRecognizer?.delegate = nil
因此它不会转到任何交互式 PopGestureRecognizer 的委托方法,并且导航控制器的行为将符合您的期望。这是实现预期行为的小解决方法。
我有一个视图控制器,我需要在其中添加自定义后退按钮。所以我添加了一个自定义 backButtonItem
。但是在添加自定义后退按钮后,我的视图控制器通过滑动返回的默认行为停止按预期工作。
如果我从视图控制器中删除自定义后退按钮,视图控制器的行为符合预期,但一旦我添加自定义后退按钮,默认行为就会停止。
我已经添加了这样的自定义后退按钮
self.navigationItem.leftBarButtonItem = getCustomBackBarButtonItem(viewController: self)
我曾尝试使用 backBarButtonItem
而不是 leftBarButtonItem
,但这样做后自定义后退按钮不会出现,并且视图控制器的行为符合预期。
如果我删除上面的代码,视图控制器的行为就如预期的那样,它可以通过滑动顺利返回。
一定要像这样构建 UIBarButtonItem:
let customBack = UIBarButtonItem(title: "Back", style:.done, target:self, action: #selector(self.letsGoBack))
然后实现弹回功能:
@objc func letsGoBack() {
self.navigationController?.popViewController(animated: true)
}
所以最后就是:
self.navigationItem.leftBarButtonItem = customBack
如果您想保留向后滑动手势,您可以将导航控制器子类化:
class YourNavigationController: UINavigationController, UIGestureRecognizerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
self.interactivePopGestureRecognizer?.delegate = self
}
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return self.viewControllers.count > 1
}
}
返回上一个 viewController
初始化 UIBarButton
var backBtn:UIBarButtonItem!
将 UIBarButton 添加到 NavigationBar
backBtn = UIBarButtonItem(title: "Go-Back" , style: .plain, target: self, action: #selector(self.backBtnClicked(_:)))
self.navigationItem.leftBarButtonItem = backBtn
将此功能添加到您的 class
func backBtnClicked(_ sender:UIBarButtonItem) {
if let redirect = self.navigationController?.popViewController(animated: true) {
// If you open this viewController by using pushViewController this will called
} else {
self.dismiss(animated: true, completion: nil)
// If you open this viewController by using present this will called
}
}
希望对您有所帮助
您可以简单地添加以下行,而不是将委托设置为自己:
self.navigationController?.interactivePopGestureRecognizer?.delegate = nil
因此它不会转到任何交互式 PopGestureRecognizer 的委托方法,并且导航控制器的行为将符合您的期望。这是实现预期行为的小解决方法。