将数据从一个UIViewController委派给另一个UIViewController

时间:2019-05-25 18:18:12

标签: ios swift delegates

我对Swift编程完全陌生,并尝试通过单击发送 {{将一个单独的String从一个ViewController委托到另一个button 1}}。问题是,它不起作用...

我想这对您来说很容易解决,并且考虑到如果您向我解释我做错了什么,那将非常有帮助。 :)

非常感谢

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 个答案:

答案 0 :(得分:2)

据我了解,此代码块不起作用,但问题不在代码中,实际上,这是您选择发送数据的方式。在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()
}

}

希望对您有帮助。

答案 1 :(得分:0)

@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
    }
}