В iOS разработке, передача данных между UIViewController
(VC) может осуществляться несколькими способами, и будем рассматривать два наиболее распространенных способа: использование делегатов и замыканий (closures).
1. Использование делегатов:
Делегат - это объект, который предоставляет возможность другому объекту сообщать о происходящих событиях и передавать данные. Для передачи данных обратно от одного VC к другому, мы можем определить протокол делегата в одном VC (назовем его SourceViewController
), а затем сделать другой VC (назовем его DestinationViewController
) делегатом такого протокола.
Код в SourceViewController
будет выглядеть примерно так:
protocol DataDelegate: class { func didReceiveData(data: String) } class SourceViewController: UIViewController { weak var delegate: DataDelegate? // Функция, которая будет вызываться, чтобы передать данные обратно func sendData() { let data = "Hello, World!" delegate?.didReceiveData(data: data) } // ... }
А код в DestinationViewController
будет таким:
class DestinationViewController: UIViewController, DataDelegate { override func viewDidLoad() { super.viewDidLoad() let sourceVC = SourceViewController() sourceVC.delegate = self } // Реализация метода делегата для получения переданных данных func didReceiveData(data: String) { print(data) // "Hello, World!" // Делать что-то с данными здесь } // ... }
Таким образом, DestinationViewController
становится делегатом SourceViewController
, и когда вызывается метод sendData()
в SourceViewController
, данные передаются обратно через метод делегата didReceiveData(data:)
в DestinationViewController
.
2. Использование замыканий:
Замыкания - это анонимные функции, которые могут сохранять и передавать код. Мы можем использовать замыкания для передачи данных обратно от одного VC к другому.
Код в SourceViewController
будет выглядеть так:
class SourceViewController: UIViewController { var onDataReceived: ((String) -> Void)? // Функция, которая будет вызываться, чтобы передать данные обратно func sendData() { let data = "Hello, World!" onDataReceived?(data) } // ... }
Код в DestinationViewController
будет выглядеть примерно так:
class DestinationViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let sourceVC = SourceViewController() sourceVC.onDataReceived = { data in print(data) // "Hello, World!" // Делать что-то с данными здесь } } // ... }
Теперь, когда вызывается метод sendData()
в SourceViewController
, переданные данные доступны через замыкание onDataReceived
в DestinationViewController
.
В обоих случаях, при передаче данных обратно, важно учитывать жизненный цикл VC и правильно устанавливать делегаты или замыкания, чтобы избежать утечки памяти.