为什么这个委托模式不起作用?在委托视图控制器中选择按钮后,我想在第二个视图控制器(标签出口(中显示名称属性
我已经完成了以下步骤:
-
在"老板"视图控制器中创建协议 --> 委托视图控制器
-
将我的函数分配给此协议 --> 选择按钮
- 在委托视图控制器中创建选择按钮委托变量
- 在ViewController中,我创建了一个DelegateViewController((的新实例
- 在viewDidLoad中,我为实例的委托分配了平等的自我
- 我已经创建了一个带有传递参数的函数的扩展
DelegateViewController:
import UIKit
protocol SelectionDelegate {
func selectedButton(name: String)
}
class DelegateViewController: UIViewController {
var selectionButtonDelegate: SelectionDelegate!
@IBAction func bayernButton(_ sender: UIButton) {
selectionButtonDelegate.selectedButton(name: "Bayern")
}
@IBAction func dortmundButton(_ sender: UIButton) {
selectionButtonDelegate.selectedButton(name: "Dortmund")
}
}
视图控制器:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var selectedButton: UILabel!
let model = DelegateViewController()
override func viewDidLoad() {
super.viewDidLoad()
model.selectionButtonDelegate = self
}
}
extension ViewController: SelectionDelegate {
func selectedButton(name: String) {
selectedButton.text = name
}
}
你的实现看起来不错,通过查看你的代码问题似乎
let model = DelegateViewController()
您正在创建 DelegateViewController
的新实例,但您必须从控制器的其他某个实例单击按钮DelegateViewController
。
您可能需要获取正确的model
实例,而不是创建一个新的实例,或者应该从新创建的视图控制器实例中点击按钮。
示例:可能需要做类似的事情
class ViewController: UIViewController {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender)
if let navigationController = segue.destination as? DelegateViewController {
selectionButtonDelegate = self = self
}
}
}
您没有将 selectionButtonDelegate 分配给当前活动的 DelegateViewController。修改代码以访问委托视图控制器的当前实例。
import UIKit
protocol SelectionDelegate {
func selectedButton(name: String)
}
class DelegateViewController: UIViewController {
static weak var shared: DelegateViewController!
weak var selectionButtonDelegate: SelectionDelegate!
override func viewDidLoad() {
super.viewDidLoad()
DelegateViewController.shared = self
}
@IBAction func bayernButton(_ sender: UIButton) {
selectionButtonDelegate.selectedButton(name: "Bayern")
}
@IBAction func dortmundButton(_ sender: UIButton) {
selectionButtonDelegate.selectedButton(name: "Dortmund")
}
}
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var selectedButton: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
DelegateViewController.shared.selectionButtonDelegate = self
}
}
extension ViewController: SelectionDelegate {
func selectedButton(name: String) {
selectedButton.text = name
}
}
此外,在大多数情况下,在 Swift 中声明委托变量之前使用 weak 以避免内存泄漏。