【发布时间】:2016-05-13 08:25:10
【问题描述】:
我有以下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
【问题讨论】:
-
像这样的 getter 并不常见,因为您的 getter 和您的变量具有相同的访问控制,因此在任何可以调用该 getter 的地方,您都可以直接访问该变量。如果您想拥有不同级别的访问控制,例如带有公共 getter 的私有 var,它们会很有用
-
您是否曾经将 SoundEvent 类中的委托设置为实际对象?
-
@WillM。是的,请参阅
Sentence类中的第一个要点。let event1 = SoundEvent(text: "klein", duration: DurationsArray[Int(durationIndex1)]) -
设置委托属性的哪一部分? IE。 soundEvent.delegate = self
-
他没有。他所做的只是创建一个
SoundEvent的实例。
标签: ios swift protocols delegation