Swift:委托协议没有正确设置UILabel

我有以下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在句子中的types[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:你不应该在swift中inheritance窗体NSObject,除非它真的有必要

你永远不会设置委托属性。 这是零。 它永远不会被调用。