Swift 4 中的委派模式不起作用!谁能解释 Swift 4 中正确的委托模式?



为什么这个委托模式不起作用?在委托视图控制器中选择按钮后,我想在第二个视图控制器(标签出口(中显示名称属性

我已经完成了以下步骤:

  1. 在"老板"视图控制器中创建协议 --> 委托视图控制器

  2. 将我的函数分配给此协议 --> 选择按钮

  3. 在委托视图控制器中创建选择按钮委托变量
  4. 在ViewController中,我创建了一个DelegateViewController((的新实例
  5. 在viewDidLoad中,我为实例的委托分配了平等的自我
  6. 我已经创建了一个带有传递参数的函数的扩展

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 以避免内存泄漏。

最新更新