双击“后退”按钮UINavigationBar时弹出根目录

时间:2019-01-18 07:14:13

标签: ios swift xcode

我正在测试一个应用程序,发现双击后退按钮时,它会自动弹出到导航控制器的根视图控制器。没有任何代码可以明确地执行此操作,我想知道这是否是导航控制器中后退按钮的默认行为。

我已经在另一个应用程序中测试了同一件事,但问题并不存在,所以唯一可以解释这一点的事情是,其他事情正在触发popToRoot,而我不知道是什么。

对不起,但是我无法在此处发布代码。只需要您对此发表意见。

谢谢!

3 个答案:

答案 0 :(得分:0)

当我看到这个问题时,我将这个想法应用到了当前的项目中,并成功了,谢谢。因此,实现此目的的一个方法是有一个自定义的后退按钮。我可以将整个代码发布到此,但这将使它变得像汤匙一般。无论如何,这里是步骤:

制作一个UIButton,并在您的navigationController的navigationBar中将其设为自定义后退按钮UIBarButtonItem

选择器显然是这样的,不必在乎里面的代码,因为这是从我的项目中删除的,但是您知道了:

func back() {
        if let navCon = self.navigationController {
            navCon.popViewController(animated: true)
        }
  }

对于双击,您将需要一个tapGesture。我这样宣布:

private lazy var doubleTapGesture: UITapGestureRecognizer = {
    let gesture = UITapGestureRecognizer(target: self, action: #selector(self.doubleTap))
    gesture.numberOfTapsRequired = 2
    return gesture
}()

并将其添加到您的按钮。选择器将是这样的:

@objc private func doubleTap() {
        self.navigationController?.popToRootViewController(animated: true)
}

瞧!工作顺利。容易吧?我希望这会有所帮助!

答案 1 :(得分:0)

正如我上面在Glenns答案中所评论的那样,将popViewController分配到主线程中可能是一个问题,因为在识别到双击时也会执行它。也许这是一个稍微“稳定”的解决方案:

private func setupBackButton() {
    let myBackButton = UIButton(type: .custom) // or whatever
    // setup title, image etc.

    let myCustomBackButtonItem = UIBarButtonItem(customView: myBackButton)
    self.navigationItem.leftBarButtonItem  = myCustomBackButtonItem         

    // Create gesture recognizers for single and double tap:
    let singleRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.singleTap))
    singleRecognizer.numberOfTapsRequired = 1

    let doubleRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.doubleTap))
    doubleRecognizer.numberOfTapsRequired = 2

    // single tap should only fire if double tap is not recognized
    singleRecognizer.require(toFail: doubleRecognizer)

    myBackButton.addGestureRecognizer(singleRecognizer)
    myBackButton.addGestureRecognizer(doubleRecognizer)
}

@objc private func singleTap() {
    self.navigationController?.popViewController(animated: true)
}

@objc private func doubleTap() {
    self.navigationController?.popToRootViewController(animated: true)
}

答案 2 :(得分:-2)

谢谢您的所有回答,但是我的问题是我不希望这种行为,我的帖子被误解了,对此我感到抱歉。

否则,我解决了自己的问题。在导航控制器的导航栏中添加了一个子视图,该子视图被隐藏在其下方。并且以某种方式,即使该subView处于下面,也启用了交互。所以我在隐藏时禁用了交互。就是这样。