如何使用协议发送数据并使用 IBAction 进行委托(单击按钮)

How to send data with Protocols and Delegate with IBAction (Button click)

你好,我最近在课程中遇到了协议和代表(iOS 开发人员在这里生产)。

我试图在我的简单应用程序中应用它,它基本上什么都不做,但我想将数据从一个 VC 传递到另一个。

更具体地说: ViewControllerOne 有按钮并设置 segue 以转到我的 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)

  }
}

它什么也没发送,我试图用打印语句解决它,显然(当按钮被点击时),但即使我在 viewDidLoad 中打印委托,它也显示为 nil。

当我尝试 Whosebug 的另一种方法时,例如将委托声明为弱变量,Xcode 甚至不允许我这样做。

感谢愿意花 his/her 时间解决此问题并提出任何有助于我理解或解决问题的人。

如果能解决这个问题,我未来的打算是在 VCTwo 上获取一些数据并使用该数据进行更新,例如VC一个上的标签文本。

谢谢 最好的祝福 彼得

由于您使用 segue 导航到 ViewControllerTwo,因此 ViewControllerOne 中的 vcTwo 实例将不是推送的视图控制器实例。您必须覆盖 ViewControllerOne 中的 prepare(for segue 才能访问 ViewControllerTwo 的实例,然后设置委托。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let vcTwo = segue.destination as? ViewControllerTwo {
        vcTwo.delegate = self
    }
}