Swift:使用NSTimer来调用动作

时间:2015-07-19 12:49:34

标签: swift nstimer

我正在尝试使用AVAudioPlayerNSTimer点击特定秒数时如何调用操作。

代码:

var audioFile = try! AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("FileName", ofType: "mp3")!))

override func viewDidLoad() {
    super.viewDidLoad()
    NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("checkPlaybackTime:"), userInfo: nil, repeats: true)
}

func checkPlaybackTime(timer:NSTimer){
    let seconds : NSTimeInterval = audioFile.currentTime
    if (seconds == 20.0){
        btnPausePlay.setTitle("Play", forState: UIControlState.Normal)
    }
}

我想要调用的动作是btnPausePlay按钮文本设置为“Play”,它从未像我在if语句中调用它那样。

编辑:它现在有效。我从if (seconds == 20.0更改为if (seconds >= 20.0)

2 个答案:

答案 0 :(得分:0)

虽然这个答案没有明确使用NSTimer,但它确实利用addPeriodicTimeObserverForInterval类的方法AVPlayer来达到同样的目的:

初始化播放器后,请执行以下操作:

let observerInterval = CMTimeMakeWithSeconds(0.5, 100) //this sets the interval at every half second
timeObserverToken = audioPlayer.addPeriodicTimeObserverForInterval(observerInterval, queue: nil, usingBlock: self.getPlaybackTimer)

函数getPlaybackTimer如下所示:

func getPlaybackTimer(time: CMTime){
    let currentTime = audioPlayer.currentTime()
    /* *** */
}

答案 1 :(得分:0)

正如nhgrif指出的那样,你的逻辑是有缺陷的。您正在以不应该的方式比较浮点值。在比较浮点数时,几乎总是需要考虑一些变化。

然而,在这种情况下,这并不足够,因为您的比较可能会在检查间隔之外发生。你最好在这里使用不等式,即> = 20.0。您可能想要禁用计时器。