簡體   English   中英

Swift 4中的委托模式不起作用! 誰能解釋Swift 4中的正確委托模式?

[英]Delegation Pattern in Swift 4 doesn't work! Can anyone explain the correct delegate pattern in Swift 4?

為什么此委托模式不起作用? 在DelegateViewController中選擇一個Button后,我想在第二個ViewController中顯示name屬性(標簽出口)

我已完成以下步驟:

  1. 在“老板” 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")

    }
}

ViewController:

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實例,而不是創建一個新的model ,或者應該從新創建的View Controller實例中點擊按鈕。

示例:可能需要做類似的事情

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。 修改您的代碼以訪問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,以避免內存泄漏。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM