2017-02-11 3 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 (используя информацию, которая передается): вар rowSelected = IndexPath() // это информация, уготованное от MainPageVC

override func viewDidLoad() { 
    super.viewDidLoad() 

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

в этом 2-й ViewController есть кнопка, которая перетекает в третью ViewController (это также работает отлично). Тем не менее, в этом третьем viewController есть кнопка назад, которая отходит назад ко второму viewController. Проблема в том, что код 2-го viewController viewDidLoad() зависит от переменной, переданной от 1-го VC. Поскольку он не передается (потому что segue теперь из 3-> 2 вместо 1-> 2) приложение сбой. Я не уверен, что лучший способ передать эту информацию соответствующим образом. Как это сделать?

+0

Возможный дубликат [Передача данных между контроллерами представлений] (http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers) – Rob

ответ

1

Вы не используете 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, если у вас есть " т это уже сделано, потому что вы будете часто использовать его в разработке. –