如何使用 swift 中的闭包而不是委托将数据从一个 VC 传递到另一个 VC?



我目前有两个VC,一个显示计数器UILabel,另一个显示一个按钮,按下该按钮应该将原始VC上的UILabel递增1。

我还在学习 Swift,我知道如何使用委托来解决这个问题,但想学习如何使用闭包来解决这个问题,如果没有看到示例,我发现这有点困难;因此有赏金的问题。

这是我的第一个使用 UILabel 计数器的 VC:

var tappedCount: Int = 10
lazy var label: UILabel = {
let label = UILabel()
label.text = "(tappedCount)"
label.textAlignment = .center
label.font = UIFont(name: "Copperplate", size: 90)
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
navigationItem.title = "Navigation Controller"
navigationController?.navigationBar.isTranslucent = false
view.addSubview(label)
view.addSubview(button)
let nextButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(moveToSecond))
navigationItem.rightBarButtonItem = nextButton
label.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
label.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
}
@objc func moveToSecond() {
show(SecondViewController(), sender: self)
}

这是我的第二个带有按钮的VC:

class SecondViewController: UIViewController {
var callback : (() -> Void)?
@objc func buttonPressed() {
print("hello")
}
let button: UIButton = {
let button = UIButton()
button.translatesAutoresizingMaskIntoConstraints = false
button.addTarget(self, action: #selector(buttonPressed), for: .touchUpInside)
button.setTitle("HELLO", for: .normal)
button.backgroundColor = .red
return button
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
view.addSubview(button)
button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
button.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
button.heightAnchor.constraint(equalToConstant: 100).isActive = true
button.widthAnchor.constraint(equalToConstant: 100).isActive = true
}
}

您必须在第一个视图控制器中分配闭包,并在第二个视图中调用它

moveToSecond更改为

@objc func moveToSecond(_ sender : UIBarButtonItem) {
let secondViewController = SecondViewController()
secondViewController.callback = {
self.tappedCount += 1
self.label.text = Sting(self.tappedCount)
}
show(secondViewController, sender: self)
}

buttonPressed

@objc func buttonPressed(_ sender : UIButton) {
callback?()
}

最好将受影响的 UI 元素作为sender传递到action

最新更新