[英]Swift: Delegation protocol not setting UILabel properly
我有以下Protocol
:
protocol SoundEventDelegate{
func eventStarted(text:String)
}
我在這節課中稱呼它為:
class SoundEvent {
var text:String
var duration:Double
init(text: String, duration: Double){
self.text = text
self.duration = duration
}
var delegate : SoundEventDelegate?
func startEvent(){
delegate?.eventStarted(self.text)
}
func getDuration() -> Double{
return self.duration //TODO is this common practice?
}
}
我有我的ViewController
符合:
class ViewController: UIViewController, SoundEventDelegate {
//MARK:Properties
@IBOutlet weak var beginButton: UIButton!
@IBOutlet weak var kleinGrossLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
//DELEGATE method
func eventStarted(text:String){
kleinGrossLabel.text = text
}
//MARK: actions
@IBAction func startImprovisation(sender: UIButton) {
var s1:Sentence = Sentence(type: "S3")
var s2:Sentence = Sentence(type: "S1")
var newModel = SentenceMarkov(Ult: s1, Penult: s2)
s1.start()
beginButton.hidden = true
}
}
但是,當我運行該應用程序時, kleinGrossLabel.text
不會更改。 我是否以錯誤的方式提及標簽? 還是我進行委派的方式不正確?
這是Sentence
和SentenceMarkov
的完整Class
定義的鏈接
https://gist.github.com/anonymous/9757d0ff00a4df7a29cb- Sentence
https://gist.github.com/anonymous/91d5d6a59b0c69cba915 - SentenceMarkov
您永遠不會設置委托屬性。 沒關系 它永遠不會被調用。
首先,迅速傳授二傳手並不常見。 如果您想擁有只讀屬性,則可以在其他情況下使用private(set) var propertyName
,只需訪問注釋中提到的屬性即可
此外,我不明白了一個道理,為什么你eventArray
句子的類型為[SoundEvent?]
不是[SoundEvent]
作為SoundEvent
似乎並不具有failable初始化器
如前所述,您不僅需要實現SoundEventDelegate協議,還需要設置委托
問題是您無法真正從SoundEventDelegate
訪問SoundEventDelegate
,因為您在Sentence
實例化了SoundEvents
var soundEventDelegate: SoundEventDelegate?
最簡單的方法是為句子添加soundEventDelegate
屬性,並將其設置為:
let s1:Sentence = Sentence(type: "S3")
let s2:Sentence = Sentence(type: "S1")
s1.soundEventDelegate = self
s2.soundEventDelegate = self
在內部聲音中,您需要將每個事件的委托設置為Sentence
的soundEventDelegate
您可以這樣做:
var soundEventDelegate: SoundEventDelegate? = nil {
didSet {
eventArray.forEach({$0.delegate = soundEventDelegate})
}
}
或編寫另一個接受委托的初始化程序
希望這可以幫助
ps:除了確實有必要,您不應該迅速繼承NSObject形式
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.