Как отслеживать свойства переменной в другом контроллере представления - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть 3 контроллера вида: в 1-ом V C я получаю данные сервисным вызовом. Извлеченные данные находятся в массиве объектов. Когда нажимается кнопка в первом V C, я передаю этот массив объектов во второй V C, где он показывает массив объектов в табличном представлении. В ячейке табличного представления есть кнопка «Мне нравится», которая показывает общее количество лайков от объекта. Когда я нажимаю на ячейку табличного представления, он открывает 3-й V C, где он показывает детали, а также похожую кнопку.

Я передаю объект следующим образом:

func openImagesList() {
    if let vc = self.storyboard?.instantiateViewController(withIdentifier: "ImagesList") as? ImagesListVC {            
        vc.imageModel = self.imagesModel
        self.navigationController?.pushViewController(vc, animated: true)
    }
}

Сейчас объект меняется в 3-м и 2-м ВК, но когда он меняется, я хочу такие же изменения и в 1-м V C. Как я могу отслеживать это?

1 Ответ

1 голос
/ 27 апреля 2020

Более современной альтернативой использованию делегата является использование замыкания. Например, допустим, вы хотите передать данные из SecondVC обратно в FirstVC:

class FirstVC: UIViewController {

    private func presentSecondVC() {
        let secondVC = SecondVC()
        secondVC.dataChangedHandler = dataChanged(data:)
        present(secondVC, animated: true)
    }

    private func dataChanged(data: SomeModel) {
        // do stuff with data
    }

}

В SecondVC, вам нужна переменная для обработчика:

class SecondVC: UIViewController {

    var dataChangedHandler: ((SomeModel) -> Void)?

    private var data: SomeModel = ...

    private func dataDidChange() {
        dataChangedHandler?(data)
    }

}

Вместо делегата вы используете dataChangedHandler, закрытие для передачи данных туда и обратно. Вы можете легко расширить этот метод до трех контроллеров представления, передавая ссылку на dataChanged(data:).

Использование замыканий является кратким (вам даже не нужен протокол) и универсальным. Он также очень модульный, так как вам не нужно напрямую выставлять FirstVC.

...