簡體   English   中英

Swift委托協議為零

[英]Swift delegate protocol is nil

我已經對此進行了100次研究,但仍然找不到我的問題的答案。 我有一個非常簡單的協議,但始終為nil 我嘗試添加periodDelegate = self但收到錯誤消息: Cannot assign value of type 'ScoreClockPopoverViewController' to type 'PeriodDelegate!' 我有其他協議,使用相同的設置並且工作正常。

我想念什么?

提前致謝!

import UIKit

protocol PeriodDelegate {

    func changePeriodButtonImage(selectedPeriod: Period)

}

class ScoreClockPopoverViewController: UIViewController {

    //delegate
    var periodDelegate: PeriodDelegate!

    override func viewDidLoad() {
        super.viewDidLoad()


        print("viewDidLoad / periodDelegate \(String(describing: periodDelegate!))")

    }

}

我需要調用的函數在UICollectionViewCell中

class HeaderCollectionViewCell: UICollectionViewCell {

    override func awakeFromNib() {
        super.awakeFromNib()

        ...

    }


extension HeaderCollectionViewCell: PeriodDelegate {

    func changePeriodButtonImage(selectedPeriod: Period) {

        print("blah")

        switch selectedPeriod {
        case .first:
            print("first")
        case .second:
            print("second")
        case .third:
            print("third")
        case .overtime:
            print("overtime")
        case .shootout:
            print("shootout")

        }
    }
}

首先,讓單元格作為視圖控制器的委托是非常罕見的。 通常情況是相反的。 但是無論如何,在您的情況下,您必須將periodDelegate設置為此單元格,而不是self。 因為您的單元實施委托協議而不是VC。 但是最好重新考慮您要做什么,因為它聞起來像是不良的設計。

您的聲明“我有一個非常簡單的協議,但始終為零。” 沒有道理。

協議是一種特殊的語言。 它不能為nil或非nil。

您的ScoreClockPopoverViewController的委托屬性periodDelegate符合PeriodDelegate協議,並且該委托屬性為nil。

委托是與其他財產一樣的財產。 除非您為其分配值,否則它將為nil。 這是零,因為您從未將對象分配為ScoreClockPopoverViewController的委托。

誰創建了ScoreClockPopoverViewController實例,以及哪個對象應該是ScoreClockPopoverViewController的委托?

發布您的代碼,創建一個ScoreClockPopoverViewController 這可能是您需要分配代表的地方。 該代碼可能看起來像這樣:

let myScoreClockPopoverViewController = storyboard.instantiateViewControllerWithIdentifier("ScoreClockPopoverViewController")
myScoreClockPopoverViewController.periodDelegate = self
present(myScoreClockPopoverViewController, 
  animated: true, 
  completion: nil)

(該代碼僅供參考,您將需要對其進行修改以使其在您的應用中正常工作。 未經修改,將無法將其粘貼到您的應用中。

顧名思義,如果將myScoreClockPopoverViewController顯示為彈出窗口,則需要調整上面的代碼。

我遇到了同樣的問題,並按照方命的答案進行了修改,只是進行了更改

var periodDelegate: PeriodDelegate!

weak var periodDelegate: PeriodDelegate? = nil

並更改為

periodDelegate?.blablabla()

Swift-在協議/委托之間傳遞數據時出錯(發現為零)

暫無
暫無

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

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