我正在开发一个通过逐个播放逐个句子的声音文件来播放叙述的应用程序。 使用下面的代码,它按预期播放。但是,在添加"停止"按钮停止播放,我发现"停止"按钮没有停止声音。
我测试了"停止"按下之前按钮" Play"按钮,没有问题(消息被打印)。然而,按下" Play"而当NarrationPlayer正在播放时,"停止"按钮没有工作(没有打印消息)。
知道什么是错的吗?
import UIKit
import AVFoundation
class ViewController: UIViewController,AVAudioPlayerDelegate {
var NarrationPlayer:AVAudioPlayer = AVAudioPlayer()
var soundlist: [String] = []
var counter = 0
}
func playSound(_ soundfile: String) {
let NarPath = Bundle.main.path(forResource: soundfile, ofType:"mp3")!
let NarUrl = URL(fileURLWithPath: NarPath)
do {
NarrationPlayer = try AVAudioPlayer(contentsOf: NarUrl)
NarrationPlayer.delegate = self
} catch{
print(error)
}
NarrationPlayer.play()
}
@IBAction func play(_ sender: Any) {
soundlist.append("a")
soundlist.append("b")
soundlist.append("c")
playSound("first")
while counter < soundlist.count{
if NarrationPlayer.isPlaying == true{
}
else{
playSound(soundlist[counter])
counter += 1
}
}
}
@IBAction func StopPlay(_ sender: Any) {
print("stop button worked")
}
答案 0 :(得分:0)
您遇到的问题是这一行:
while counter < soundlist.count{
正在占据主线程,点击你的&#34;停止播放&#34;实际射击的按钮。
你已经设置了一个委托方法,你可以在这里做的一件非常方便的事情就是增加你的计数器并在每次声音文件结束时播放下一个声音文件。
这样的事情:
func playSound(_ soundfile: String) {
let NarPath = Bundle.main.path(forResource: soundfile, ofType:"mp3")!
let NarUrl = URL(fileURLWithPath: NarPath)
do {
NarrationPlayer = try AVAudioPlayer(contentsOf: NarUrl)
NarrationPlayer.delegate = self
} catch{
print(error)
}
NarrationPlayer.play()
}
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool)
{
playSound(self.soundlist[counter])
counter += 1
}
@IBAction func play(_ sender: Any) {
playSound("first")
soundlist.append("a")
soundlist.append("b")
soundlist.append("c")
}
最后一条建议:
将名称NarrationPlayer
更改为narrationPlayer
。 Swift中的变量,如Objective-C,应该以小写(也称为lowerCamelCase)开头。