2017-02-11 124 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中的委派,如果你沒有'因爲你經常在開發中使用它。 –

相關問題