导航栏的返回默认行为不起作用

时间:2017-12-12 06:16:00

标签: ios swift uiviewcontroller uinavigationbar

我有一个视图控制器,我需要添加一个自定义后退按钮。所以我添加了自定义backButtonItem。但是在添加自定义后退按钮后,我的视图控制器通过滑动返回的默认行为会按预期停止工作。

如果我从视图控制器中删除自定义后退按钮,视图控制器的行为就像预期的那样,但只要我添加自定义后退按钮,默认行为就会停止。

我添加了这样的自定义后退按钮

self.navigationItem.leftBarButtonItem = getCustomBackBarButtonItem(viewController: self)

我尝试使用backBarButtonItem代替leftBarButtonItem,但通过这样做,自定义后退按钮不会出现,并且视图控制器的行为符合预期。

如果删除上面的代码,视图控制器的行为就像预期的那样,并且可以通过滑动顺利返回。

3 个答案:

答案 0 :(得分:2)

不是将委托设置为自己,而只需添加以下行:

self.navigationController?.interactivePopGestureRecognizer?.delegate = nil

因此它不会进入任何交互式PopGestureRecognizer的委托方法,导航控制器的行为将符合您的期望。这是实现预期行为的小型解决方法。

答案 1 :(得分:1)

确保使用以下内容构建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
    }
}

答案 2 :(得分:0)

导航回上一个viewController

初始化UIBarButton

var backBtn:UIBarButtonItem!

将UIBarButton添加到NavigationBar

backBtn = UIBarButtonItem(title: "Go-Back" , style: .plain, target: self, action: #selector(self.backBtnClicked(_:)))

self.navigationItem.leftBarButtonItem = backBtn

将此功能添加到您的课程中

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
   }
}

希望这会对你有所帮助