如何使用 Swift 委托模式在视图之间传输数据
How to transfer data between views using Swift Delegate pattern
我是在读学生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
}
}
在那种情况下,您真的不需要委托。
您可以在实例化 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 控制器发送回登录视图控制器,则需要一个委托。
首先,您最大的问题是 "self.delegate" 为零,原因有二:
您没有将它分配给任何东西,所以您的参数 "delegate" 仍然为零。
"ShowCompanyVC" 在委托函数 "sendData" 之后被实例化,这意味着您已经错过了分配委托的机会。
在这种情况下我不会求助于使用委托,我建议您按照@Glenn 的建议更多地研究 delegates/delegation。
我可能会更直接地解决您的问题:
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
}
}
我是在读学生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
}
}
在那种情况下,您真的不需要委托。
您可以在实例化 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 控制器发送回登录视图控制器,则需要一个委托。
首先,您最大的问题是 "self.delegate" 为零,原因有二:
您没有将它分配给任何东西,所以您的参数 "delegate" 仍然为零。
"ShowCompanyVC" 在委托函数 "sendData" 之后被实例化,这意味着您已经错过了分配委托的机会。
在这种情况下我不会求助于使用委托,我建议您按照@Glenn 的建议更多地研究 delegates/delegation。
我可能会更直接地解决您的问题:
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
}
}