如何使用 Swift 委托模式在视图之间传输数据
Posted
技术标签:
【中文标题】如何使用 Swift 委托模式在视图之间传输数据【英文标题】:How to transfer data between views using Swift Delegate pattern 【发布时间】: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
【问题讨论】:
欢迎来到 ***。我建议你研究第一个代表/代表团。那里有很多教程。喜欢appcoda.com/swift-delegate 我要去学习了! 【参考方案1】:首先你最大的问题是你的“self.delegate”是 nil 有两个原因:
您没有将它分配给任何东西,因此您的参数“delegate”保持为零。
“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 控制器将数据发送回登录视图控制器,则需要委托。
【讨论】:
以上是关于如何使用 Swift 委托模式在视图之间传输数据的主要内容,如果未能解决你的问题,请参考以下文章
iOS Swift:闭包(回调)与委托,何时使用? [关闭]