【问题标题】:Delegation Pattern in Swift 4 doesn't work! Can anyone explain the correct delegate pattern in Swift 4?Swift 4 中的委托模式不起作用!谁能解释 Swift 4 中正确的委托模式?
【发布时间】:2018-10-11 01:14:06
【问题描述】:

为什么这个委托模式不起作用?在 DelegateViewController 中选择一个按钮后,我想在第二个 ViewController(标签出口)中显示 name 属性

我做了以下步骤:

  1. 在“Boss”ViewController 中创建协议 --> DelegateViewController

  2. 将我的功能分配给这个协议 --> selectedButton

  3. 在 DelegateViewController 中创建 selectionButtonDelegate 变量
  4. 在 ViewController 中,我创建了一个新的 DelegateViewController() 实例
  5. 在 viewDidLoad 中,我随后将实例的委托分配为等于 self
  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

    }
}

【问题讨论】:

  • 您从不显示model 中的ViewController,那么如何点击任何按钮?
  • 委托变量应该是可选类型。哪个控制器在堆栈中排在第一位?委托控制器还是视图控制器?
  • DelegateViewController 是初始视图控制器,在堆栈中排在第一位。
  • @rmaddy 我的按钮在堆栈中排在第一位,你能解释一下为什么我应该从我的 ViewController 显示模型吗?以及如何显示模型?
  • @iOSFats 如果 DelegateViewController 是初始视图控制器,那么您将得到 selectionButtonDelegate = nil ,视图控制器应该在堆栈中排在第一位,并且只会分配您的委托

标签: ios swift delegation


【解决方案1】:

您没有将 selectionButtonDelegate 分配给当前活动的 DelegateViewController。修改您的代码以访问您的 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 以避免内存泄漏。

【讨论】:

  • 非常感谢您的努力。这个解决方案对我不起作用。有什么我忘记了吗?
【解决方案2】:

通过查看您的代码问题,您的实现看起来不错

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
        }
     }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多