簡體   English   中英

Swift:委派協議未正確設置UILabel

[英]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不會更改。 我是否以錯誤的方式提及標簽? 還是我進行委派的方式不正確?

這是SentenceSentenceMarkov的完整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

在內部聲音中,您需要將每個事件的委托設置為SentencesoundEventDelegate

您可以這樣做:

var soundEventDelegate: SoundEventDelegate? = nil {
    didSet {
        eventArray.forEach({$0.delegate = soundEventDelegate})
    }
}

或編寫另一個接受委托的初始化程序

希望這可以幫助

ps:除了確實有必要,您不應該迅速繼承NSObject形式

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM