Как получить доступ к дочернему контроллеру представления из родительского контроллера представления в swift?

#swift #xcode

#swift #xcode

Вопрос:

У меня есть контроллер представления, у которого есть дочерний контроллер представления, и я хочу получить доступ к этому дочернему контроллеру представления из его родительского контроллера представления.

Как я могу этого добиться?

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

1. просто удерживайте ссылку на этот контроллер представления, если у вас нет ссылки — тогда view.subviews.first { $0 is YourViewController }

2. @VitaliiShvetsov Извините, но я не понял!

Ответ №1:

Ответ таков… (барабанная дробь ……) … это зависит .. 🙂

NSViewController amp; UIViewController иметь .parent свойство. https://developer.apple.com/documentation/uikit/uiviewcontroller/1621362-parent
https://developer.apple.com/documentation/appkit/nsviewcontroller/1434491-parent

Однако он заполняется только в том случае, если вы реализуете шаблон проектирования container-view-controller: https://developer.apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html (многие компоненты uikit используют этот шаблон), т.Е.:

 aViewController.addChild(bViewController)
bViewControler.didMove(toParent: aViewController)
bViewController.parent // is aViewController
  

* Примечание: вам придется самостоятельно управлять стеком представлений, это просто гарантирует, что такие вещи, как обработчики жизненного цикла / рисования / изменения размера / etc, выполняются в правильном порядке

Если вам нужно сохранить ссылку на контроллер представления (дочерний или иной), создайте свойство для дочернего элемента и установите на него ссылку или используйте дизайн container-view-controller, это очень полезно.

Приветствия
— J

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

1. Получена эта ошибка: EXC_BAD_ACCESS (code = 2, address = 0x7ffeed03ff68)

2. @Simran Я не уверен, как вы это реализуете, но вот скриншот этого в действии. i.imgur.com/1QMpJT1.png

Ответ №2:

Есть много способов, но для простого объяснения я думаю, что этот пример будет для вас поучительным.

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

    let parentVC = UIViewController()
   let childVC = UIViewController()

   parentVC.navigationController?.viewControllers.append(childVC)
   let childVCisHere = parentVC.navigationController?.viewControllers.first
  

Наконец, подумайте об аналогии, которую я установил на — GodFather — семейная иерархия

Дон Вито Корлеоне, он босс, также отец семейства parentVC

Сонни Корлеоне, он занимается грязной работой, перемещает дочерние элементы от имени семейного NavigationController

Майкл Корлеоне, он маленький братан, люди видят его в основном на экране 🙂 childVC

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

1.Также ознакомьтесь с этими статьями, чтобы понять концепцию, в них есть полезные расширения, а также swiftbysundell.com/basics/child-view-controllers hackingwithswift.com/example-code/uikit /…

2. Я пытался, но получаю эту ошибку: EXC_BAD_ACCESS (code = 2, address = 0x7ffeed03ff68)

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