Передача данных из родительского UIViewController в контейнер (childViewController) при каждом изменении значения

#ios #swift #uiviewcontroller #childviewcontroller

#iOS #swift #uiviewcontroller #childviewcontroller

Вопрос:

У меня есть UIViewController, который имеет два контейнера, и каждый контейнер связан с UIViewController для некоторых конкретных функций.

Для людей, которые обесценивают мой вопрос, будет более полезно и оценено, если вы вместо этого укажете мне правильный путь.

то, что я пытаюсь сделать, это передать данные из родительского ViewController в childViewControllers

  • Я попробовал это с помощью протокола / делегата: но проблема в том, что я не смог назначить делегат childViewContainer, поскольку у него нет экземпляра от родительского.

  • Моя вторая попытка заключалась в использовании функции prepare, но она работает не так хорошо, поскольку два контейнера загружаются сразу, как только родительский загружается первым. поэтому, если значение изменено в parentViewController, я не могу передать его снова дочернему элементу.

введите описание изображения здесь

Есть идеи, пожалуйста?

Комментарии:

1. Покажите код, в котором родитель создает эти дочерние элементы.

2. Я создал их с помощью раскадровки и использую их «alpha = 0 или alpha = 1» для переключения между ними

3. Вы проверили Notifications ? (Я все еще считаю, что шаблон делегирования должен работать лучше, но вы действительно должны показать достаточно, чтобы я мог воспроизвести вашу точную проблему.)

Ответ №1:

После более глубокого изучения я смог найти решение для своего собственного вопроса. здесь я собираюсь опубликовать, понадобится ли это кому-либо еще в будущем

итак, прежде всего, мне нужно, чтобы он запускал childcontroller из родительского контроллера, а не из раскадровки (поэтому я удалил переход между родительским и дочерним. создайте переменную для childController следующим образом:

  lazy  var firstChildViewController: FirstChildViewController =  {
        let storynoard = UIStoryboard(name: "Main", bundle: nil)
        let viewController = storynoard.instantiateViewController(identifier: "firstChild") as! FirstChildViewController
    self.addChild(viewController)
    self.view.addSubview(viewController.view)
        return viewController
        
    }()
  

то же самое для другого, если у вас два дочерних элемента

а затем в viewDidLoad:

    override func viewDidLoad() {
        
        super.viewDidLoad()
        firstChildViewController.view.isHidden  = false
        secondChildViewController.view.isHidden = true
    }
  

а затем в FirstChildViewController:

     override func viewDidLoad() {
    
    super.viewDidLoad()
    if let parent = self.parent as? ParentViewController {
     parent.delegate = self
 }
  

}

И проблема решена, надеюсь, это кому-то поможет