Swift:委派协议未正确设置 UILabel

Swift: Delegation protocol not setting UILabel properly

我有以下 Protocol:

protocol SoundEventDelegate{
  func eventStarted(text:String)
}

我在这个 class 中调用:

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

您从未设置委托 属性。是零。它永远不会被调用。

首先,在 swift 中设置 setter 并不常见。如果你想要只读 属性 你可以使用 private(set) var propertyName 在其他情况下,只需像评论

中提到的那样访问 属性

我也看不出你 eventArray 在句子中的类型是 [SoundEvent?] 而不是 [SoundEvent] 的原因,因为 SoundEvent 似乎没有失败的初始化程序

如前所述,您不仅需要实现 SoundEventDelegate 协议,还需要设置委托

问题是您无法真正从 viewcontroller 访问 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({[=12=].delegate = soundEventDelegate})
    }
}

或者编写另一个接受委托的初始化程序

希望对您有所帮助

p.s:你不应该在 swift 中继承 NSObject 的形式,除非确实有必要