【问题标题】:Back button to root navigation controller返回到根导航控制器的按钮
【发布时间】:2019-09-27 15:21:29
【问题描述】:

我正在使用故事板并且有 3 个 VC。当我在 VC3 上时,我希望后退按钮跳过 VC2 并转到 VC1。

我尝试了以下方法,但在我到达 VC1 之前 VC2 会闪烁

override func viewWillDisappear(_ animated: Bool) {
    self.navigationController?.popViewController(animated: true)
}

我的自定义返回码:

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
    self.navigationController?.navigationBar.shadowImage = UIImage()
    self.navigationController?.navigationBar.isTranslucent = true
    self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "arrow_back")
    self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "arrow_back")
    self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: #selector(self.backPressed(_:)))
    self.navigationController?.navigationBar.barStyle = .black  
}

@objc func backPressed(_ sender: Any){
    print("here")
    self.navigationController?.popToRootViewController(animated: false)
}

【问题讨论】:

  • 在 VC3 中按下返回时尝试使用 navigationController?.popToRootViewController(animated: true)。
  • 使用展开转场
  • 如何推送VC3?使用故事板转场?
  • @Vikky 如何将那段代码分配给我的后退按钮?
  • 只需在 VC3 中后退按钮的 @IBAction 中编写代码。但我认为你正在使用 segue?。

标签: ios swift


【解决方案1】:

viewDidLoad 的变化

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
    self.navigationController?.navigationBar.shadowImage = UIImage()
    self.navigationController?.navigationBar.isTranslucent = true
    self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "arrow_back")
    self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "arrow_back")

     var backButton = UIBarButtonItem(title: "", style: .plain, target: self, action: #selector(backPressed(_:)))
     navigationController?.navigationBar.topItem?.backBarButtonItem = backButton
    self.navigationController?.navigationBar.barStyle = .black  
}

添加 如果你想在第一个控制器使用

@objc func backPressed(_ sender: Any){
     self.navigationController?.popToRootViewController(animated: true) 
}

如果它不是导航控制器中的第一个视图控制器

@objc func backPressed(_ sender: Any){
     let controllerToBeReached = navigationController!.viewControllers.filter { $0 is YourViewController }.first!
     navigationController!.popToViewController(controllerToBeReached, animated: true)
}

【讨论】:

  • 我还使用 viewWillDisappear 功能吗? override func viewWillDisappear(_ animated: Bool) { self.navigationController?.popToRootViewController(animated: true) } 这仍然会在到达 VC1 之前为 VC2 创建一个动画。我应该使用其他东西来触发返回按钮吗?
  • 为什么在viewWillDisappear中做?您应该在导航控制器的后退按钮的操作中执行我的代码
  • 这里完成了吗? self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
  • 在 UIBarButtonItem(title: "", style: .plain, target: nil, action: #selector(self.backPressed(:))) 我得到错误(1)表达式列表中的预期表达式(2) 调用中参数#1 缺少参数。在 @objc func backPressed(_ sender: Any){ self.navigationController?.popToRootViewController } 我收到错误(1)表达式解析为未使用的函数
  • 把 _ 放在 : ... 冒号之前,两个错误都会消失
【解决方案2】:

如果您不想在 VC1 出现之前看到 VC2 闪烁,并且如果 VC1 是根目录,则只需设置 animated = false

从您的 VC3 覆盖操作,然后使用:self.navigationController?.popToRootViewController(animated: false)

【讨论】:

    【解决方案3】:

    在您的代码返回按钮中自动执行popToViewControllerviewWillDisappear 方法调用,以便您在VC2 上闪烁

    在 VC3 中添加 Back BarButtonitem 以执行转到 VC3VC1 的操作

    override func viewDidLoad {
            super.viewDidLoad()
            self.navigationItem.hidesBackButton = true
            let customBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItem.Style.plain, target: self, action: #selector(back))
            self.navigationItem.leftBarButtonItem = customBackButton
        }
    

    这里方法返回UIBarButtonItem

    @objc func back(sender: UIBarButtonItem) {
        let vc = VC1()
        self.navigationController.popToViewController(vc, animated: true) 
    }
    

    【讨论】:

    • 这可行,但会杀死我的自定义后退按钮。 self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "arrow_back") self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "arrow_back")
    • 如果你想在后退按钮中使用图像,请使用 UIBarButtonItem(image: UIImage(named: "arrow_back"), style: .plain, target: self, action: #selector(backPressed(_:) ))
    • 你不需要使用 backIndicatorImage 或 backIndicatorTransitionMaskImage 因为我们使用 UIBarButtonItem navigationBar。
    猜你喜欢
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多