为什么这个代码在控制器之间传递数据不起作用?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么这个代码在控制器之间传递数据不起作用?相关的知识,希望对你有一定的参考价值。
我正在尝试理解代表,所以我创建了这个简单的应用程序来测试它,我只是想从secondViewController传递一个字符串到MainViewController ...我试图遵循所有的步骤,但似乎有一些东西缺失,我不喜欢我不知道它可能是什么......这是我的代码......
主视图控制器
class mainController: UIViewController, sendDataDelegate {
let label: UILabel = {
let lab = UILabel()
lab.text = "No data"
lab.textAlignment = .center
lab.translatesAutoresizingMaskIntoConstraints = false
return lab
}()
let tapRecognizer = UITapGestureRecognizer()
let secondVC = SecondViewController()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.green
// assign delegate to self, not working...
secondVC.delegate = self
tapRecognizer.addTarget(self, action: #selector(goToSecondVC))
view.addGestureRecognizer(tapRecognizer)
view.addSubview(label)
// label constraints..
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":label]))
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-200-[v0]", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":label]))
}
@objc func goToSecondVC(){
show(SecondViewController(), sender: nil)
}
func passData(str: String) {
print(str)
label.text = str
}
}
和第二个视图控制器加协议发送数据...
import UIKit
//protocol to pass the data..
protocol sendDataDelegate {
func passData(str: String)
}
class SecondViewController: UIViewController {
let tapRecog = UITapGestureRecognizer()
let dataStr = "data passed"
var delegate: sendDataDelegate?
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.red
tapRecog.addTarget(self, action: #selector(goBack))
view.addGestureRecognizer(tapRecog)
}
@objc func goBack(){
// trying to pass data here..
delegate?.passData(str: dataStr)
// dismiss view...
dismiss(animated: true, completion: nil)
}
}
我想指出我正在尝试通过代码学习所有东西,所以这里没有使用故事板......我怎么能通过代码来做到这一点?
谢谢大家的答案!祝你有美好的一天)
答案
在您的函数goToSecondVC
中,您将创建一个全新的视图控制器并忽略您创建的属性。
将其更改为使用secondVC
而不是SecondViewController()
。
另一答案
此更正将解决您的问题:
@objc func goToSecondVC(){
show(secondVC, sender: nil)
}
最好用大写字母命名协议:
protocol SendDataDelegate: AnyObject {
func passData(str: String)
}
不要忘记弱代表:
weak var delegate: SendDataDelegate?
另一答案
改变goToSecondVC()
方法如下:
@objc func goToSecondVC(){
let vc = SecondViewController()
vc.delegate = self
show(vc, sender: nil)
}
以上是关于为什么这个代码在控制器之间传递数据不起作用?的主要内容,如果未能解决你的问题,请参考以下文章