我正在测试一个应用程序,发现双击后退按钮时,它会自动弹出到导航控制器的根视图控制器。没有任何代码可以明确地执行此操作,我想知道这是否是导航控制器中后退按钮的默认行为。
我已经在另一个应用程序中测试了同一件事,但问题并不存在,所以唯一可以解释这一点的事情是,其他事情正在触发popToRoot,而我不知道是什么。
对不起,但是我无法在此处发布代码。只需要您对此发表意见。
谢谢!
答案 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处于下面,也启用了交互。所以我在隐藏时禁用了交互。就是这样。