2017-02-11 109 views
1

我想建立在viewControllers之间传递信息的地方,如下所示:1-> 2-> 3-> 2。目前我有一个设置来传递来自VC 1-> 2的信息。传递的信息是从表中选择单元格的indexPath。该信息需要传递,因为第二个viewController'viewDidLoad()中的代码取决于所选的单元格。它被设置为如下(和正常工作): VC 1:如何在3个视图控制器之间传递信息?

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(这也能正常工作)。但是,在那个第三 viewController有一个后退按钮,回到第二个viewController。问题是,第二个viewController的viewDidLoad()代码依赖于从第一个VC传递的变量。由于它没有被传递(因为现在从3> 2而不是1-> 2),应用程序崩溃。我不确定适当传输此信息的最佳方式是什么。应该怎么做?

+0

可能重复[在视图控制器之间传递数据](http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers) – Rob

回答

1

除非使用Unwind segue,否则不会真正使用segues向后导航。从你所描述的情况来看,这听起来像是代表团是你想要的。

尝试这样:

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特定值添加到协议的方法。

+0

也强烈建议阅读iOS中的委派,如果你没有'因为你经常在开发中使用它。 –

相关问题