Теперь, как бы я сделал это с контроллером C или даже контроллером D.
Это хорошая причина для организации вашего приложения на основе модели данных . Делегат приложения или контроллер первого представления могут создать модель, которая должна содержать данные и бизнес-логику для приложения. Каждый контроллер представления передает ссылку на модель любым другим созданным им контроллерам представления, и тогда вам не нужно сильно беспокоиться о передаче данных между контроллерами представления. Если ваш контроллер представления C или D вносит некоторые изменения в модель, их не нужно явно возвращать в A ... A просто автоматически получает обновленные данные благодаря общению с той же моделью данных, которую использует C или D .
Вот конкретный пример. Допустим, вы создаете органайзер для продавцов. Таким образом, ваша модель данных может называться OrganizerModel
, и она будет включать список customers
. Вы можете нажать на кнопку, чтобы увидеть все местоположения клиентов на карте, а затем вы можете нажать на определенное местоположение на карте, чтобы просмотреть и изменить данные клиентов. Итак, как эти изменения должны быть доведены до остальной части приложения? Давайте представим, что есть MainViewController
, который показывает основной вид приложения и позволяет получить доступ к списку клиентов, списку поставщиков, каталогу продуктов, календарю и т. Д. Когда вы нажимаете кнопку, чтобы просмотреть список клиентов, MainViewController
переходит к CustomerListViewController
, а в prepare(for:sender:)
он делает что-то вроде:
guard let customerListController = segue.destinationController as CustomerListViewController else {
//...
}
customerListController.customerList = self.organizerModel.customerList
Так что теперь контроллер списка клиентов имеет доступ к списку клиентов, и это все, что ему нужно для своей работы. Оттуда пользователь может нажать кнопку, чтобы увидеть всех клиентов на карте, и когда это произойдет, CustomerListViewController
перейдет к CustomerMapViewController
, снова сделав что-то вроде:
guard let customerMapController = segue.destinationController as CustomerMapViewController else {
//...
}
customerMapController.customerList = self.customerList
Таким образом, CustomerMapViewController показывает карту, включающую маленькие значки для каждого клиента, и когда пользователь нажимает на одну из них, он переходит к CustomerViewController, которому для выполнения всего, что он делает, требуется только одна запись клиента:
guard let customerController = segue.destinationController as CustomerProfileViewController else {
//...
}
customerController.customer = self.customerList[selectedCustomer]
Теперь у нас есть ситуация, подобная вашему A->B->C->D
случаю, когда контроллер представления в нескольких шагах от первого изменяет некоторые данные. Но когда CustomerProfileViewController
вносит некоторые изменения в customer
, нет необходимости отправлять эту информацию обратно в MainViewController
, потому что MainViewController
и CustomerProfileViewController
используют одни и те же данные; это customer
является частью общей модели, которую использует MainViewController
.