@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)
|
Этот метод менее предпочтителен для передачи временных данных, но полезен для глобального хранения и доступа к данным.
Каждый из этих методов имеет свои плюсы и минусы. Выбор зависит от того, насколько сложны ваши контроллеры, требуется ли передача данных в обоих направлениях, и других архитектурных соображений.