У меня есть вид контейнера, который я вошел в свою раскадровку. Там есть замечательная маленькая стрела, представляющая встроенную сцену в другую сцену. Этот объект верхнего уровня сцены управляется пользовательским UIViewController
. Я хочу вызвать метод, реализованный в моем пользовательском классе. Если у меня есть доступ к контейнеру, как мне получить ссылку на то, что внутри?
Как получить представление внутри контейнера в Swift?
Ответ 1
Вы можете использовать prepareForSegue
, метод в UIViewController
, чтобы получить доступ к любому UIViewController
, отделяемому от вашего текущего контроллера представления, включая embed
segues.
Из документации о prepareForSegue
:
По умолчанию реализация этого метода ничего не делает. Контроллер вашего представления переопределяет этот метод, когда ему необходимо передать соответствующие данные новому контроллеру. Объект segue описывает переход и включает ссылки на оба диспетчера представлений, участвующих в сегменте.
В вашем вопросе, о котором вы говорили, нужно вызвать метод на вашем настраиваемом контроллере. Вот пример того, как вы могли это сделать:
1. Дайте вашему встроенному идентификатору идентификатор. Вы можете сделать это в построителе интерфейса, выбрав свой segue, перейдя в редактор атрибутов и посмотрев под Storyboard Embed Segue.
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. Например:
И теперь все должно работать. Надеюсь, что это поможет!
Ответ 2
Ответ ABaker дает отличный способ для родителя узнать о ребенке. Чтобы код в дочернем элементе достиг родителя, используйте self.parent
(или в ObjC, parentViewController
).
Ответ 3
var vc: ContainerVC {
return (self.childViewControllers.first as? ContainerVC)!
}