【问题标题】:How to pass info between 3 viewcontrollers?如何在 3 个视图控制器之间传递信息?
【发布时间】:2017-02-11 16:52:33
【问题描述】:

我希望在 viewController 之间进行信息传递的设置如下:1->2->3->2。目前我有一个设置来传递来自 VC 的信息 1->2。传递的信息是从表中选择单元格的 indexPath。需要传递信息,因为第二个 viewController'viewDidLoad() 中的代码取决于所选的单元格。它的设置如下(并且工作正常): VC 1:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        guard segue.identifier == "cellSelected" else {return}
        let indexPath = self.tableView.indexPathForSelectedRow
        let rowSelectedd = indexPath
        let destViewController: MainPageCellSelectedViewController = segue.destination as! MainPageCellSelectedViewController
        destViewController.rowSelected = rowSelectedd!
    }
    var rowSelectedd = IndexPath()
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        performSegue(withIdentifier: "cellSelected", sender: rowSelectedd)
    }

VC 2(使用传递的信息): var rowSelected = IndexPath() //这有从 MainPageVC 准备的信息

override func viewDidLoad() {
    super.viewDidLoad()

    if rowSelected.section == 0{
        //do something
    } else{
        // do something else
    }
}

在第二个 viewController 中有一个按钮可以连接到第三个 viewController(这也可以正常工作)。然而,在那个 third viewController 中,有一个返回按钮可以连接到第二个 viewController。问题是,第二个 viewController 的 viewDidLoad() 代码取决于从第一个 VC 传递的变量。由于它没有被通过(因为 segue 现在是从 3->2 而不是 1->2)应用程序崩溃。我不确定正确传输此信息的最佳方式是什么。应该怎么做?

【问题讨论】:

标签: swift uiviewcontroller


【解决方案1】:

除非您使用 Unwind segue,否则您不会真正使用 segue 向后导航。根据您的描述,听起来委托是您想要的。

试试这样的:

protocol ThirdVCDelegate {
    func somethingHappens()
}

class SecondVC: UIViewController {
    override func prepare(for segue:UIStoryboardSegue, 
                                   sender: Any?) 
    {
        if segue.identifier == "whatever the segue is between second and third VC" {
            let thirdVC = segue.destination as! ThirdVC
            thirdVC.delegate = self
        }
    }
}

extension SecondVC: ThirdVCDelegate {
    func somethingHappens() {
        // Do whatever you want in SecondVC in response to some action in ThirdVC
    }
}

class ThirdVC: UIViewController {
    var delegate:ThirdVCDelegate!

    func someMethodWhereYouWantToMakeACallbacktoSecondVC {
       delegate.somethingHappens()
       // You can pop or dismiss your thirdVC if you're done with it here.
    }
}

如果您想将特定值从 thirdVC 传递给 secondVC,您还可以向协议方法添加参数。

【讨论】:

  • 如果您还没有阅读 iOS 中的委托,也强烈建议您阅读,因为您将在开发中经常使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 2014-11-19
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
相关资源
最近更新 更多