Как отправлять данные с помощью протоколов и делегировать с помощью IBAction (нажатие кнопки)
Здравствуйте, я недавно прошел через протоколы и делегатов (здесь работает разработчик iOS).
Я попытался применить это в своем простом приложении, которое в основном ничего не делает, но я хотел передавать данные из одного виртуального канала в другой.
Более конкретно: у ViewControllerOne есть кнопка и установка перехода для перехода к моему ViewControllerTwo, у ViewControllerTWo также есть кнопка, с которой я хочу теперь печатать только некоторый текст, когда я нажимаю кнопку на ViewControllerTwo.
Вот код:
Приемник
class ViewControllerOne: UIViewController, DataDelegate {
var vcTwo = ViewControllerTwo()
override func viewDidLoad() {
super.viewDidLoad()
vcTwo.delegate = self
}
func printThisNumber(type: Int){
print("This is a test of delegate with number: \(type)")
}
Отправитель с определенным протоколом
protocol DataDelegate {
func printThisNumber(type: Int)
}
class ViewControllerTwo: UIViewController {
var delegate: DataDelegate?
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func myButtonPressed(_ sender: UIButton) {
delegate?.printThisNumber(type: 1)
}
}
Он ничего не отправляет, и я попытался устранить его с помощью оператора печати, который, очевидно, показывает nil (при нажатии кнопки), но даже если я печатаю делегат в viewDidLoad, он показывает nil.
Когда я пробовал другие подходы из Stackru, такие как объявление делегата как weak var, Xcode даже не позволял мне это делать.
Спасибо всем, кто потратит свое время на эту проблему и предложит все, что поможет мне понять ее или решить.
Если с этим удастся разобраться, я намерен в будущем получить некоторые данные о VCTwo и обновить их, например, текст метки на VCOne.
Спасибо С уважением Петр
1 ответ
Поскольку вы используете segue для перехода к ViewControllerTwo
, то vcTwo
экземпляр в ViewControllerOne
не будет экземпляром контроллера представления. Вам придется переопределитьprepare(for segue
в ViewControllerOne
для доступа к этому экземпляру ViewControllerTwo
, а затем установите делегата.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let vcTwo = segue.destination as? ViewControllerTwo {
vcTwo.delegate = self
}
}