【问题标题】:(Swift) popping back to navigation controller(Swift) 弹回导航控制器
【发布时间】:2020-05-27 23:32:57
【问题描述】:

我将描述我想做什么。我有 3 个视图控制器。第一个应该是导航的,我认为我在代码中犯了错误。
第一个 VC 通向第二个,第二个 VC 通向第三个 VC。第三个有一个按钮,应该返回第一个。

这就是我从 firstVC 中呈现 secondVC 的方式:

let mainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let secondVC = (mainStoryboard.instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController)   
presentVC(SecondVC)

func presentVC(_ VC: UIViewController) {
        let navController = UINavigationController(rootViewController: VC)
        navController.modalPresentationStyle = .fullScreen
        self.navigationController?.present(navController, animated: true, completion: nil)
    }

现在在第二个VC中,当我点击右侧navBarItem中的Close时,应该打开第三个VC并且它工作正常,这里是代码:

ViewDidLoad

 self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Close", style: .plain, target: self, action:
#selector(closeSecondVC))

之后:

  @objc
    func closeSecondVC() {
    let mainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
            let thirdVC = (mainStoryboard.instantiateViewController(withIdentifier: "ThirdViewController") as! ThirdViewController)
            presentVC(thirdVC) //Same function as above.
}

而在这个按钮上点击第三个VC,我需要回到第一个VC,这就是我迷路的地方:

 @IBAction func btnTapped(_ sender: Any) {
        if let navController = self.navigationController {
            navController.popViewController(animated: true)
        }  //nothing happens on click
    }

【问题讨论】:

    标签: ios swift uiviewcontroller uinavigationcontroller popviewcontroller


    【解决方案1】:

    在 btnTapped 中使用以下代码:

        for controller in self.navigationController!.viewControllers as Array 
        {
          // here YourViewController is your firstVC      
         if controller.isKind(of: YourViewController.self) {
                self.navigationController!.popToViewController(controller, animated: true)
                break
            }
        }
    

    并且不要展示你的观点,将你的观点推向流行。

    【讨论】:

    • 它不起作用。我可能应该在任何地方都使用 push,但我无法摆脱 push 附带的 left navBarItem。
    • 要弹出,你必须推送,你可以在推送时隐藏 navBarItem,这非常简单。
    • 好的,我将尝试使用从 firstVC 到第二个 VC 的推送以及从 secondVC 到 thirdVC 的推送。然后我能从 3rd 跳到 1sr vc 吗?
    【解决方案2】:

    当您展示任何视图控制器时,您需要将其关闭而不是弹出!当您当时推送任何视图控制器时,您可以弹出,但在这里您正在呈现视图控制器,在这种情况下您应该像下面这样将其关闭,

    dismiss(animated: true) {
    
        }
    

    或者你应该推送新的视图控制器然后你可以弹出它!

    【讨论】:

    • 如果我解雇了第三个VC,它会让我回到第二个VC。我想回到第一个VC。
    • 然后推送一个新的视图控制器并调用self.navigationController?.popToRootViewController(animated: true) 去初始视图控制器!不要每次都做let navController = UINavigationController(rootViewController: VC)!您应该将导航控制器嵌入到 rootview 控制器一次!
    • 你应该谷歌Navigation controller tutorials,你会发现很多教程。例如,medium.com/whoknows-swift/…
    【解决方案3】:

    您正在展示导航控制器,navController.popViewController() 将不起作用。

    尝试使用推送导航

    self.navigationController?.pushViewController(vc, animated: true)
    

    现在如果你想从 ViewController3 转到 ViewController1 试试

    for controller in self.navigationController!.viewControllers as Array {
        if !controller.isKind(of: ViewController1.self) {
            self.navigationController!.popToViewController(controller, animated: true)
        } 
     else{
         break;
      }
    }
    

    【讨论】:

      【解决方案4】:

      你需要调用它来回到第一个 ViewController :

      self.navigationController?.popToRootViewController(animated: true)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-28
        • 2018-01-06
        • 2018-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多