Swift委托协议为零

时间:2017-10-25 14:24:19

标签: ios swift delegates protocols

我已经研究了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")

        }
    }
}

3 个答案:

答案 0 :(得分:0)

首先,将cell作为视图控制器的委托是非常罕见的。通常,它是另一种方式。但无论如何,在你的情况下,你必须将periodDelegate设置为此单元格,而不是自己。导致您的单元实现委托协议而不是VC。但更好地重新思考你想做什么,因为它闻起来像糟糕的设计。

答案 1 :(得分:0)

你的陈述“我有一个非常简单的协议,但总是没有。”没有意义。

协议是一种专业语言。它不能是零或非零。

您的ScoreClockPopoverViewController具有符合periodDelegate协议的委托属性PeriodDelegate,该委托属性为nil。

委托是与其他任何财产一样的财产。除非您为其指定值,否则它将为零。这是零,因为您从未将对象指定为ScoreClockPopoverViewController的委托。

谁创建ScoreClockPopoverViewController的实例,以及哪个对象应该是您ScoreClockPopoverViewController的代表?

发布创建ScoreClockPopoverViewController的代码。这可能是您需要分配代理人的地方。该代码可能如下所示:

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

(该代码仅供参考,您需要对其进行修改以使其在您的应用中发挥作用。无法在未经修改的情况下将其粘贴到您的应用中。

如果您将myScoreClockPopoverViewController显示为弹出窗口,顾名思义,您需要调整上面的代码。

答案 2 :(得分:0)

我遇到了同样的问题,我只是通过更改

来解决了方明的回答。
var periodDelegate: PeriodDelegate!

weak var periodDelegate: PeriodDelegate? = nil

并将呼叫更改为

periodDelegate?.blablabla()

Swift - Error passing data between protocols / delegates (found nil)