Функция вызова экземпляра дочернего представления из родительского контроллера представления

У меня есть MotherView, управляемый motherViewController с представлением контейнера. Представление контейнера управляется дочерним ViewController. ChildView содержит tableView.

Теперь у меня есть функция cleanTableView в childViewController, которая "сбрасывает" tableView при вызове.

func clean() {
    let indexPath = IndexPath(row: 0, section: 0)
    if let cell = tableView.cellForRow(at: indexPath) {
        if cell.accessoryType == .checkmark {
            cell.accessoryType = .none
        }
    }
}

У меня в MotherView есть кнопка. Когда эта кнопка нажата, она вызывает действие над motherViewController.

@IBAction func cancelButtonTapped(_ sender: UIBarButtonItem) {

       //call clean method of containerView instance

}

Как мне вызвать из этого действия функцию cleanTableView для конкретного экземпляра childView?


person Andreas Schultz    schedule 12.09.2018    source источник
comment
Вы можете установить NSNotificationCenter Observer или также Declare Protocol.   -  person Keyur Faldu    schedule 12.09.2018


Ответы (2)


Предполагая, что есть только один дочерний контроллер представления:

@IBAction func cancelButtonTapped(_ sender: UIBarButtonItem) {
    (children.first as? ChildViewController)?.clean()
}

Некоторая дополнительная информация об изменении/переименовании API:

Свойство childViewControllers было переименовано в children в Swift 4.2. См. https://developer.apple.com/documentation/uikit/uiviewcontroller/1621452-children?changes=latest_minor

переименование1 переименование2

person André Slotta    schedule 12.09.2018
comment
children это Swift 4.2? Это похоже на изменение классов Foundation, а не на изменение языка. Вы можете объяснить? - person Duncan C; 12.09.2018
comment
Значит, это изменение в iOS 12? - person Duncan C; 12.09.2018
comment
@DuncanC Кажется, это действительно изменение Swift 4.2 (проверьте прикрепленные скриншоты). - person André Slotta; 12.09.2018
comment
Это звучит как изменение Foundation в названиях различных функций и свойств Swift. При переходе Swift 2 -> Swift 3 также было немало таких изменений. - person Duncan C; 13.09.2018
comment
Работал! Спасибо! - person Andreas Schultz; 13.09.2018

Есть много способов сделать это, в зависимости от взаимосвязанности компонентов и от того, насколько сильно вы хотите их связать. Три примера:

  • Жесткая привязка: «материнский» VC вызывает метод «дочернего» VC, который вызывает метод дочернего View.

  • Свободная привязка с делегатами: создайте протокол делегата, свяжите дочернее представление с материнским VC через этого делегата. Затем материнский VC вызывает делегата.

  • Отключено с уведомлениями: попросите дочернее представление прослушивать определенное «чистое» уведомление. Пусть Mother VC опубликует это уведомление. Прямых связей между ними нет.

Плюсы и минусы каждого метода. Лучшее взаимодействие зависит только от вашей специфики.

person A.J    schedule 12.09.2018