Как передать данные в родительский контроллер представления
Я выполняю переход на моем родительском VC, когда нажимаю на изображение. Я хочу передать данные обратно в родительский VC из дочернего VC. Я изучал различные варианты передачи данных обратно в родительский VC, но не могу понять это.
Поскольку дочерний VC является частью Navigation и представлен (показан) посредством segue, должен быть простой способ передать данные обратно родителю.
Как это сделать?
я пробовал viewWillDisappear
метод, но parentVC равен нулю в следующем коде.
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if self.isMovingFromParent {
if let navVC = self.presentingViewController as? UINavigationController {
if let parentVC = navVC.viewControllers.first as? ParentViewController {
print("viewWillDisappear() moving to parent") // Not executed
parentVC.data = self.data
}
}
}
}
4 ответа
Одной из стратегий было бы установить родителя в качестве делегата ребенка. Вы бы создали эти отношения в prepare(for:sender:)
функция.
Если вы не знакомы с делегированием, эта статья является хорошим руководством: https://medium.com/@jamesrochabrun/implementing-delegates-in-swift-step-by-step-d3211cbac3ef
Swift 5, Xcode 10.3
Используйте любой из следующих методов
1.Доступ к ссылке parentVC через self.navigationController.viewControllers, а затем используйте эту ссылку для доступа к переменным и задания данных.
2. Вы можете использовать раскрутить Segue
3. использовать протокол делегата
если вам нужна дополнительная информация, пожалуйста, обратитесь /questions/33648607/peredacha-dannyih-mezhdu-kontrollerami-predstavleniya/33648608#33648608
Вы можете использовать 3 способа передачи данных от дочернего к родительскому ViewController, как упоминалось в предыдущем ответе, вы можете использовать делегаты или ограничения, но так как вы не хотите иметь дело с
if segue.identifier == "segueIdentifier"
затем вы можете использовать уведомления, создавая наблюдателя в родительском элементе, а затем отправляя сообщения в дочерний контроллер представления. в родительском
override func viewDidLoad(){
NotificationCenter.default.addObserver(self, selector: #selector("yourSelectorName"), name: "NotificationName", object: nil)
и в детском посте с этим.
NotificationCenter.default.post(name: "notificationName", object: nil, userInfo: ["your data array "])
если имя уведомления не является строкой, вы должны создать для него имя, и вы можете передавать данные или нет в userInfo.