Как перемещаться и передавать данные между UIViewControllers, макет которых напоминает разветвление? - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть пара UIViewControllers, как показано

Fork Layout

Я хочу передать данные из B в C а также сделать этот переход.Пока что у меня есть 2 возможных решения:

  1. Создайте новый экземпляр класса C UIViewController (и сохраните в нем ссылку на данные), нажмите B из navigation controllerи нажмите на него C.
  2. Отправьте данные в A, нажмите B из navigation controller, а затем, в viewWillAppear методе A, проверьте, не равны ли данные нулю, чтобы узнать, следует ли их отправлятьэто к C и выполнить segue.

Должен ли я принять любой из этих 2 подходов?Или есть более элегантное / правильное решение для этой ситуации?

Спасибо

Ответы [ 2 ]

2 голосов
/ 24 апреля 2019

Организация диспетчера данных родительского контроллера или использование Core Data.

В случае хранения данных в родительском контроллере используйте внедрение зависимостей, как описано здесь

Вот пример для вашего случая:

var dataFromC = "" // or nil
var dataFromB = "" // or nil

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "B",
        let viewController = segue.destinationViewController as? BViewController {
        viewController.dataFromC = self.dataFromC

//           declare method in BViewController
//           var method : ((String) -> ())? = nil
        viewController.method = {[weak self] valueFromB in
            self?.dataFromB = valueFromB
        }
    }

    if segue.identifier == "C",
        let viewController = segue.destinationViewController as? CViewController {
        viewController.dataFromB = self.dataFromB

//           declare method in CViewController
//           var method : ((String) -> ())? = nil
        viewController.method = {[weak self] valueFromC in
            self?.dataFromC = valueFromC
        }
    }
}

Если вы хотите передать значение в родительский контроллер из BViewController, используйте self.method("yourValueFromB"), где вы измените значение.Для случая с CViewController используйте тот же подход.

1 голос
/ 24 апреля 2019

Как правило, B должен отправлять данные обратно в свой исходный контроллер представления A с помощью шаблона протокола делегата. Затем A должен иметь возможность решить в реализации метода делегата, какие данные получены от B и куда отправлять эти данные, что в данном случае является C.

Таким образом, ваш код выглядит более организованным.

...