[英]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.