Подтвердить что ты не робот

Как получить представление внутри контейнера в Swift?

У меня есть вид контейнера, который я вошел в свою раскадровку. Там есть замечательная маленькая стрела, представляющая встроенную сцену в другую сцену. Этот объект верхнего уровня сцены управляется пользовательским UIViewController. Я хочу вызвать метод, реализованный в моем пользовательском классе. Если у меня есть доступ к контейнеру, как мне получить ссылку на то, что внутри?

4b9b3361

Ответ 1

Вы можете использовать prepareForSegue, метод в UIViewController, чтобы получить доступ к любому UIViewController, отделяемому от вашего текущего контроллера представления, включая embed segues.

Из документации о prepareForSegue:

По умолчанию реализация этого метода ничего не делает. Контроллер вашего представления переопределяет этот метод, когда ему необходимо передать соответствующие данные новому контроллеру. Объект segue описывает переход и включает ссылки на оба диспетчера представлений, участвующих в сегменте.

В вашем вопросе, о котором вы говорили, нужно вызвать метод на вашем настраиваемом контроллере. Вот пример того, как вы могли это сделать:

1. Дайте вашему встроенному идентификатору идентификатор. Вы можете сделать это в построителе интерфейса, выбрав свой segue, перейдя в редактор атрибутов и посмотрев под Storyboard Embed Segue.

enter image description here

2. Создайте свои классы примерно так:

Ссылка сохраняется на embeddedViewController, поэтому myMethod можно вызвать позже. Он объявлен как неявно развернутый необязательный, потому что не имеет смысла указывать ему начальное значение, отличное от нуля.

//  This is your custom view controller contained in `MainViewController`.
class CustomViewController: UIViewController {
    func myMethod() {}
}

class MainViewController: UIViewController {
    private var embeddedViewController: CustomViewController!

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let vc = segue.destination as? CustomViewController,
                    segue.identifier == "EmbedSegue" {
            self.embeddedViewController = vc
        }
    }

    //  Now in other methods you can reference `embeddedViewController`.
    //  For example:
    override func viewDidAppear(animated: Bool) {
        self.embeddedViewController.myMethod()
    }
}

3. Задайте классы вашего UIViewControllers в IB, используя Identity Inspector. Например:

enter image description here

И теперь все должно работать. Надеюсь, что это поможет!

Ответ 2

Ответ ABaker дает отличный способ для родителя узнать о ребенке. Чтобы код в дочернем элементе достиг родителя, используйте self.parent (или в ObjC, parentViewController).

Ответ 3

 var vc: ContainerVC {
        return (self.childViewControllers.first as? ContainerVC)!
    }