[英]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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.