我是一名学习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)
}}
}
首先,最大的问题是您的“ self.delegate”为零,原因有二:
您没有将其分配给任何东西,因此您的参数“ 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
}
}