@hobart.rath
Для передачи значений между ViewController в Swift существует несколько способов. Выбор подходящего способа зависит от контекста вашего приложения и архитектуры, которую вы используете. Вот некоторые из распространенных методов:
Каждый из этих методов имеет свои плюсы и минусы, и выбор зависит от того, насколько сложны ваши контроллеры, требуется ли передача данных в обоих направлениях и другие архитектурные соображения.
@hobart.rath
Для передачи значений между ViewController
в Swift существует несколько методов. Выбор подходящего метода будет зависеть от контекста вашего приложения и используемой архитектуры. Рассмотрим основные способы передачи данных:
Если вы используете Storyboard и Segue для перехода между контроллерами, вы можете передать данные в методе prepare(for:sender:)
. Пример:
1 2 3 4 5 6 7 |
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "showDetailSegue" { if let destinationVC = segue.destination as? DetailViewController { destinationVC.data = self.dataToSend } } } |
Если вы создаете и отображаете контроллеры программно, вы можете передать данные, устанавливая свойства напрямую:
1 2 3 |
let detailVC = DetailViewController() detailVC.data = self.dataToSend navigationController?.pushViewController(detailVC, animated: true) |
Вы можете использовать паттерн "делегат" для передачи данных обратно:
1 2 3 |
protocol DetailViewControllerDelegate: AnyObject { func didReceiveData(_ data: String) } |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class DetailViewController: UIViewController { weak var delegate: DetailViewControllerDelegate? func someAction() { delegate?.didReceiveData("Some Data") } } extension MainViewController: DetailViewControllerDelegate { func didReceiveData(_ data: String) { print("Received data: (data)") } } |
Замыкания также могут быть использованы для передачи данных обратно:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class DetailViewController: UIViewController { var completionHandler: ((String) -> Void)? func someAction() { completionHandler?("Some Data") } } // В основном контроллере let detailVC = DetailViewController() detailVC.completionHandler = { data in print("Received data: (data)") } navigationController?.pushViewController(detailVC, animated: true) |
Этот метод менее предпочтителен для передачи временных данных, но полезен для глобального хранения и доступа к данным.
Каждый из этих методов имеет свои плюсы и минусы. Выбор зависит от того, насколько сложны ваши контроллеры, требуется ли передача данных в обоих направлениях, и других архитектурных соображений.