в iOS6 я заметил новый Контейнерный Вид, но не совсем уверен, как получить доступ к его контроллеру из содержащего представления.
Сценарий:
Я хочу получить доступ к меткам в контроллере представления оповещения из контроллера представления, в котором находится вид контейнера.
Между ними есть связь, могу ли я это использовать?
ios
objective-c
swift
uiviewcontroller
uicontainerview
Адам Уэйт
источник
источник
Ответы:
Да, вы можете использовать segue для получения доступа к дочернему контроллеру представления (а также к его представлению и подпредставлениям). Присвойте sege идентификатор (например,
alertview_embed
), используя инспектор Атрибутов в Раскадровке. Затем пусть родительский контроллер представления (тот, в котором размещается представление контейнера) реализует такой метод:источник
Вы можете сделать это просто с помощью
self.childViewControllers.lastObject
(при условии, что у вас есть только один ребенок, в противном случае используйтеobjectAtIndex:
).источник
childViewControllers
«слишком скоро»для быстрого программирования
ты можешь написать так
источник
prepareForSegue
Подход работает, но он полагается на строку магического идентификатора Segue. Может быть, есть лучший способ.Если вы знаете класс VC, который вам нужен, вы можете сделать это очень аккуратно с помощью вычисляемого свойства:
Это зависит от
childViewControllers
. Хотя я согласен, что полагаться на первый вариант может быть хрупким, но название класса, который вы ищете, делает это довольно убедительным.источник
return childViewControllers.filter { $0 is CamperVanViewController }.first
в одном лайнереchildViewControllers.flatMap({ $0 as? CamperVanViewController }).first
что считаю немного лучше, так как он забрасывает и избавляет от любых нолей.first(where:)
.childViewControllers.first(where: { $0 is CamperVanViewController })
Обновленный ответ для Swift 3, используя вычисляемое свойство:
Это только повторяет список детей, пока не достигнет первого совпадения.
источник
self.childViewControllers
более актуально, когда вам нужен контроль со стороны родителя. Например, если дочерний контроллер представляет собой табличное представление и вы хотите принудительно перезагрузить его или изменить свойство с помощью нажатия кнопки или любого другого события в Parent View Controller, вы можете сделать это, обратившись к экземпляру ChildViewController, а не через prepareForSegue. Оба имеют свои приложения по-разному.источник
Есть другой способ, используя оператор переключения Swift для типа контроллера представления:
источник
Я использую код как:
источник
Если кто-то ищет Swift 3.0 ,
тогда будут доступны viewController1 , viewController2 и так далее.
источник
С дженериком вы можете делать некоторые приятные вещи. Вот расширение для Array:
Затем вы можете сделать это в вашем viewController:
источник
ты можешь написать так
источник