Делегировать данные из одного UIViewController в другой - PullRequest
0 голосов
/ 25 мая 2019

Я совершенно новичок в программировании на Swift и попытался делегировать один String от одного ViewController другому, нажав send button. Проблема в том, что это не работает ...

Полагаю, вам было бы легко решить это, учитывая, что было бы очень полезно, если бы вы объяснили мне, что я сделал не так. :)

Большое спасибо

import UIKit


protocol protoTYdelegate {
    func didSendMessage(message: String)
}


class New: UIViewController {

    @IBOutlet weak var SendButton: UIButton!

    var tydelegate: protoTYdelegate?

    override func viewDidLoad() {
        super.viewDidLoad()

    }





    @IBAction func SendButtonAction(_ sender: Any) {

        let nachricht = "It works fine."
        tydelegate?.didSendMessage(message: nachricht)

    }

}

import UIKit


class ThankYouPage: UIViewController {


    @IBOutlet weak var numbersView: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        let controller = New()
        controller.tydelegate = self

    }

}

extension ThankYouPage: protoTYdelegate{
    func didSendMessage(message: String) {
        numbersView.text = message
    }

Ответы [ 2 ]

2 голосов
/ 25 мая 2019

Насколько я понимаю, этот блок кода не работает, но проблема не в коде, это способ отправки данных. В разработке для iOS существует много способов отправки данных. В вашем случае вам нужно использовать метод prepareForSegue для отправки данных в новый класс, не обязательно использовать делегатов.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "ThankYouPage") {
    let vc = segue.destination as! ThankYouPage
    vc.message = "Message that you want to send"
    }
}

И вам нужно реализовать свою ThankYouPage как:

class ThankYouPage: UIViewController {

@IBOutlet weak var numbersView: UILabel!
var message = ""

override func viewDidLoad() {
    super.viewDidLoad()

    numbersView.text = message
}

}

В дополнение к этому, вы можете использовать метод didSet для распечатки сообщения на этикетке вместо прямой печати в методе viewDidLoad. Просто:

class ThankYouPage: UIViewController {

@IBOutlet weak var numbersView: UILabel!
var message: String?{
    didSet{
      numbersView.text = message
  }
} 

override func viewDidLoad() {
    super.viewDidLoad()
}

}

Надеюсь, это поможет вам.

0 голосов
/ 26 мая 2019

@Eyup Göymen ответ правильный.

У меня есть другой способ, предполагая, что вы не используете segue и вы нажимаете на следующий контроллер с помощью ручного кода.

Так что вашThankYouPage код должен быть таким:

import UIKit

class ThankYouPage: UIViewController {

    @IBOutlet weak var numbersView: UILabel!

    override func viewDidLoad() {
         super.viewDidLoad()
    }

    @IBAction func someButtonAction(_ sender: Any) { // By clicking on some, you are opening that `New` controller
         let detailView = self.storyboard?.instantiateViewController(withIdentifier: "New") as! New
         detailView.tydelegate = self
         self.navigationController?.pushViewController(detailView, animated: true)
    }
}

extension ThankYouPage: protoTYdelegate {

     func didSendMessage(message: String) {
         numbersView.text = message
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...