繁体   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