我是iOS和Swift编程新手。我有一个标签,当StreamingKit框架的状态发生变化时,该标签应自动更新。
目前,当我按下另一个按钮(它再次调用self.updateView()
功能)时,标签才会改变,但我希望它在状态发生变化时自动发生,而不是按另一个按钮。
以下是代码:
func updateView() {
dispatch_async(dispatch_get_main_queue()) {
if let label = self.bufferingLabel, let button = self.playerButton{
if let audioPlayer = self.player{
if(audioPlayer.state == STKAudioPlayerStateBuffering)
{
self.playerState = "Loading"
button.setImage(self.image1, forState: UIControlState.Normal)
}
else(audioPlayer.state == STKAudioPlayerStatePlaying)
{
self.playerState = self.defaultPlayerState
self.playerState = "Playing"
button.setImage(self.image1, forState: UIControlState.Normal)
}
label.text = self.playerState!
}
}
因此,当我按下此按钮时,它会给出第一个状态(正在加载),但在完成后(状态已更改),标签应该更改为播放,但它不会。
@IBAction func pressStart(sender: AnyObject) {
//declare path to streaming
let filePath = "http://mp3.streampower.be/mnm-high.mp3"
if player == nil {
self.player = STKAudioPlayer()
self.player?.delegate = self
}
if let audioPlayer = player{
if (audioPlayer.state == STKAudioPlayerStateReady) ||
(audioPlayer.state == STKAudioPlayerStateStopped){
audioPlayer.play(filePath)
}else{
audioPlayer.stop()
}
}
self.updateView()
}
我也尝试了一些代表
func audioPlayer(audioPlayer: STKAudioPlayer!, didStartPlayingQueueItemId queueItemId: NSObject!) {
self.updateView()
}
func audioPlayer(audioPlayer: STKAudioPlayer!, didFinishBufferingSourceWithQueueItemId queueItemId: NSObject!) {
self.updateView()
}
func audioPlayer(audioPlayer: STKAudioPlayer!, stateChanged state: STKAudioPlayerState, previousState: STKAudioPlayerState) {
self.updateView()
}
答案 0 :(得分:0)
您应该查看并使用delegate
的{{1}}属性。
我不熟悉它,但通常在iOS世界中,这就是你如何从一个对象接收事件(该对象将一些东西委托给你选择的对象)。
答案 1 :(得分:0)
每当流媒体工具包发生变化时,您都可以使用NSNotifications发送信号。然后,您可以向UI视图控制器添加一个观察器,它将在收到信号时触发函数。
如果您想尝试功能性反应式编程,您还可以使用Reactive Cocoa框架来执行类似的信号观察器模式。最后,有一个简单的旧键值观察。其中一个选项应该可以帮助你。