Если вам нужно передать данные с одного контроллера представления на другой, и вы используете segue для представления нового контроллера представления, вы можете просто переопределить prepare(for:sender:)
, нет необходимости использовать делегаты. Здесь вы можете получить ссылку на контроллер, который будет представлен, и вы можете назначить его переменную.
Итак, сначала создайте переменную во втором контроллере представления и объявите, что если вы присваиваете ей новое значение, это изменит текст вашей метки
class ViewControllerB: UIViewController {
@IBOutlet weak var label: UILabel!
var variable: String? {
didSet {
label.text = variable
}
}
}
Теперь в первом представлении контроллер переопределяет prepare(for:sender:)
, и, если segue - segue, который вы выполнили, понизьте целевой контроллер вида и назначьте его переменную
class ViewController: UIViewController {
@IBAction func ok(_ sender: Any) {
performSegue(withIdentifier: "goingB", sender: self)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "goingB" {
let destinationVC = segue.destination as! ViewControllerB
destinationVC.variable = "sd"
}
}
}
В любом случае, если вы хотите использовать свой код с делегатом, вы должны установить делегат первого контроллера представления в качестве контроллера второго представления, который будет представлен. Для этой цели вы также можете использовать prepare(for:sender:)
, где вы можете получить ссылку для назначения segue, а затем вы можете вызвать свой метод для делегата
class ViewController: UIViewController {
var delegate: server?
@IBAction func ok(_ sender: Any) {
performSegue(withIdentifier: "goingB", sender: self)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "goingB" {
let destinationVC = segue.destination as! ViewControllerB
delegate = destinationVC
delegate?.datum(data: "sd")
}
}
}
Примечания:
- Название протокола с большой заглавной буквой
Server
, и мы говорим о делегатах, добавьте слово делегата: ServerDelegate
- Протокол ограничения для только классов
- Сделайте тогда свою переменную делегата
weak
protocol ServerDelegate: class {
func datum(data: String)
}
...
weak var delegate: ServerDelegate?