Вот как я уже некоторое время перемещался между контроллерами представления и нашел его весьма эффективным. Каждый из моих ViewControllers обычно имеет класс ViewModel, который отвечает за загрузку или сохранение логики c и / или данных. Я создаю такие свойства модели представления в каждом контроллере представления:
class ExampleViewController: UIViewController {
lazy var viewModel = ExampleViewModel()
override func viewDidLoad() {
super.viewDidLoad()
// Load data to the controller via the view model here
viewModel.loadSomeData()
}
// This could be linked to a button from the UI builder
@IBAction func nextPressed(_ sender: Any) {
// Possibly use the view model to persist data here
viewModel.saveSomeData()
// Then navigate to the next controller
self.navigationController?.pushViewController(NextViewController(), animated: true)
}
}
В приведенном выше примере NextViewController будет иметь собственную модель представления, которая будет обрабатывать загрузку и сохранение данных. Как вы возвращаете данные из модели представления в контроллер, зависит от вас. Если это простые данные, вы можете просто вернуть их из функций, в противном случае для более сложных или асинхронных функций вы можете использовать делегат или замыкание. Хранение данных в контроллере может помешать классу стать слишком раздутым и уменьшить зависимость контроллеров друг от друга.
Таким образом, у вас обычно есть некоторый слой данных (возможно, несколько) под моделью представления. Это может быть API, который вызывает модель представления, или приложение может иметь локальную базу данных. И модель представления отделяет это от контроллера и представлений.
На немного не связанной стороне заметке я также предпочитаю, чтобы мои контроллеры были в виде файлов swift и .xib, вместо использования раскадровки, когда это возможно. Я нахожу, что доски с большими историями имеют тенденцию становиться очень медленными и в конечном итоге становятся утомительными для внесения изменений. Затем вы можете также инициализировать контроллеры, как я делал в примере, и вам не нужно сначала создавать объект раскадровки. Но это всего лишь личные предпочтения.