Чтобы попытаться дать немного больше разъяснений ...
Шаблон разработки протокола / делегата позволяет нам "делегировать" работу другому классу / объекту.
Очень часто используемый случай - там, где люди даже не осознают, что используют его - это с табличными представлениями. Само табличное представление определяет, когда пользователь нажимает на строку, а затем сообщает своему делегату , что только что произошло. В этот момент табличное представление не знает, какое действие следует предпринять на основе выбора строки ... оно просто сообщает своему делегату (контроллеру табличного представления):
"Привет! Пользователь выбрал один из моих рядов! "
и контроллер соответствует этому протоколу путем реализации:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// do something because a row was selected
}
В этой реализации мы знаем кто отправляет это сообщение (tableView
), и мы знаем, какая строка была выбрана (indexPath
). Самому табличному представлению не нужно ничего знать о содержимом строки или о том, что должно произойти дальше ... оно делегирует этой задаче контроллеру.
В вашем случае вы хотите загрузить контроллер представления в представление контейнера, и чтобы кнопки в этом контроллере сообщали своему делегату (родительскому контроллеру) «нажата кнопка» и позволяли родительскому контроллеру решать, что делать - например, изменить цвет фона.
Для кнопок в родительском контроллере представления вы просто должны установить свойство .backgroundColor
представления контейнера V C, или, по выбору, вызовите функцию в этом контроллере.
Я собрал простой, очень похожий пример этого пару лет go и просто обновил его, чтобы лучше отразить то, что вы пытаетесь сделать. Вы можете найти его здесь: https://github.com/DonMag/ContainerDelegate
Это выглядит так:
Нажатие на Cyan или оранжевые кнопки (в главном контроллере) изменят фон V C в представлении контейнера.
Нажатие на красную или зеленую кнопку в представлении контейнера скажет его делегату :
"Эй! Нажата цветная кнопка!"
и функция делегата (в главном контроллере) изменит цвет фона большой метки.