【问题标题】:Get destination view controller when pressing back on navigation bar按下导航栏时获取目标视图控制器
【发布时间】:2021-05-26 10:36:22
【问题描述】:

当我们执行 segue 时,很容易获得目标视图控制器,因此我们可以使用 prepare(for:) 方法将数据传递给它。

我想知道按下导航控制器的后退按钮时执行此操作的正确方法。

我已经设法拼凑出一些可行的东西,但是在导航控制器中使用我对视图控制器层次结构的了解而不是动态获取目的地感觉是错误的。可能是我想多了?

override func willMove(toParent parent: UIViewController?) {
    super.willMove(toParent: parent)

    // This method is called more than once - parent is only nil when back button is pressed
    if (parent == nil) {
        
        guard let destination = self.navigationController?.viewControllers.first as? MyTableViewController else {
            return
        }
        
        print("destination is \(destination)")

        // set delegate of my networking class to destination here
        // call async method on networking class to retrieve updated data for my table view
    }
}

【问题讨论】:

    标签: swift uinavigationcontroller


    【解决方案1】:

    作为一般规则,尝试这样做会导致耦合过紧。您正在离开的 VC 不需要知道它的去向。

    MyTableViewController 类中的viewWillAppearviewDidAppear 中实现networking class 方法可能更好。

    不过,你可以试一试:

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        
        // make sure we're in a navigation controller
        guard let navC = navigationController else { return }
        
        if navC.viewControllers.firstIndex(of: self) != nil {
            // we're still in the nav stack, so we've either
            //  pushed to another VC, or presented a full-screen VC
            //  (or maybe something else)
            return
        }
        
        // we've been removed from the nav stack
        //  so user tapped Back button
        print("back button tapped")
        
        // see if we're navigating back to an instance of MyTableViewController
        guard let destVC = navC.viewControllers.last as? MyTableViewController else {
            return
        }
        
        // do something with destVC...
        print("on our way to", destVC)
    }
    

    注意:我只是作为一个例子做的......它需要大量的测试,可能还需要额外的案例处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      相关资源
      最近更新 更多