Как отправлять данные с помощью протоколов и делегировать с помощью 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
    }
}
Другие вопросы по тегам