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
没有改变。我是不是以错误的方式引用了标签?还是我授权的方式不对?
这里是 Sentence
和 SentenceMarkov
的完整 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 的形式,除非确实有必要
我有以下 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
没有改变。我是不是以错误的方式引用了标签?还是我授权的方式不对?
这里是 Sentence
和 SentenceMarkov
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 的形式,除非确实有必要