【问题标题】:How to transfer data between views using Swift Delegate pattern如何使用 Swift 委托模式在视图之间传输数据
【发布时间】:2020-03-21 16:16:57
【问题描述】:

我是一名学习 iOS 的学生 我们正在使用 Delegate 实现视图之间的数据传输。

但我不明白为什么没有传递数据。

我应该修复哪个部分?

而且我不想使用 segue。

伟大的开发者,分享你的知识!

我想将数据从 LoginVC 发送到 ShowCompanyVC。

//LoginVC Source...
import UIKit

protocol DataDelegate: class {
    func sendData(data: String)
}

class LoginVC: UIViewController {

    @IBOutlet weak var bizNumTF: UITextField!

    weak var delegate: DataDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    @IBAction func LoginButton(_ sender: UIButton) {
        delegate?.sendData(data: "Data")
        guard let vc = self.storyboard?.instantiateViewController(withIdentifier: "ShowCompanyVC") as? ShowCompanyVC else { return }
        self.present(vc, animated: true, completion: nil)
    }}

}

ShowCompanyVC 源码...

import UIKit

class ShowCompanyVC: UIViewController, DataDelegate {

    @IBOutlet weak var testLabel: UILabel!

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

    func sendData(data: String) {
        print(data)
        testLabel.text = data
    }
}

【问题讨论】:

  • 欢迎来到 Stackoverflow。我建议你研究第一个代表/代表团。那里有很多教程。喜欢appcoda.com/swift-delegate
  • 我要去学习了!

标签: ios swift view delegates


【解决方案1】:

首先你最大的问题是你的“self.delegate”是 nil 有两个原因:

  1. 您没有将它分配给任何东西,因此您的参数“delegate”保持为零。

  2. “ShowCompanyVC”在委托函数“sendData”之后被实例化,这意味着您错过了分配委托的机会。

在这种情况下我不会诉诸使用委托,我建议您按照@Glenn 的建议更多地研究委托/委托。

我可能会更直接地解决您的问题:

class LoginVC: UIViewController {

@IBOutlet weak var bizNumTF: UITextField!


override func viewDidLoad() {
    super.viewDidLoad()

}

@IBAction func LoginButton(_ sender: UIButton) {
    guard let vc = self.storyboard?.instantiateViewController(withIdentifier: "ShowCompanyVC") as? ShowCompanyVC else { return }
    vc.data = "Data"
    self.present(vc, animated: true, completion: nil)
}}

}

import UIKit

class ShowCompanyVC: UIViewController, DataDelegate {

//MARK: - IBOutlets

@IBOutlet weak var testLabel: UILabel!

//MARK: - Properties

var data: AnyObject?

override func viewDidLoad() {
    super.viewDidLoad()
    if let data = data as? String {
        self.sendData(data: data)
    }
}

func sendData(data: String) {

    print(data)
    testLabel.text = data
}

}

【讨论】:

    【解决方案2】:

    在这种情况下,您实际上并不需要委托。

    您可以在实例化 ShowCompanyVC 控制器后直接发送任何数据。

    class ShowCompanyVC: UIViewController, DataDelegate {
    
       var dataToBeReceived: String? // insert here the data type you expect to receive
       ...
    }
    
    class LoginVC: UIViewController {
    
        @IBAction func LoginButton(_ sender: UIButton) {
            guard let vc = self.storyboard?.instantiateViewController(withIdentifier: "ShowCompanyVC") as? ShowCompanyVC else { return }
            vc.dataToBeReceived = "any data"
            self.present(vc, animated: true, completion: nil)
        }}
    
    }
    
    

    如果您想从 ShowCompanyVC 控制器将数据发送回登录视图控制器,则需要委托。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 2018-01-02
      相关资源
      最近更新 更多