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
不会改变。 我是否以错误的方式引用了标签? 还是我这样做是不正确的代表团的方式?
这里是链接到Sentence
和SentenceMarkov
完整的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
并在里面的声音,你将需要为每个事件的委托设置Sentence
的soundEventDelegate
你可以这样做:
var soundEventDelegate: SoundEventDelegate? = nil { didSet { eventArray.forEach({$0.delegate = soundEventDelegate}) } }
或者编写另一个接受委托的初始化程序
希望这可以帮助
ps:你不应该在swift中inheritance窗体NSObject,除非它真的有必要
你永远不会设置委托属性。 这是零。 它永远不会被调用。