Как передать данные в родительский контроллер представления

Я выполняю переход на моем родительском 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.

Другие вопросы по тегам