如何在audioPlayerDidFinishPlaying方法中多个play() [英] How to multiple play() in audioPlayerDidFinishPlaying method
问题描述
当我按下"yourButton","yourButton2"或"yourButton3"时,每个播放音频文件,并且在播放音频时,UIButton被设置为选中状态.
When I press "yourButton" or "yourButton2" or "yourButton3" each plays an audio file and while the audio is playing the UIButton is set selected.
我希望"yourButton4"连续实现其他UIButton的方法. (首先,播放音频文件并设置选择的"yourButton",然后设置"yourButton2"和"yourButton3").
I would like "yourButton4" to implement the method of the other UIButtons in a row. (At first, plays an audio file and set selected "yourButton" then "yourButton2" and "yourButton3") .
但是,当我按下"yourButton4"时,"yourButton2"和"yourButton3"与play()方法同时播放.
However, when I press "yourButton4", "yourButton2" and "yourButton3" is played at same time as play() method Plays a sound asynchronously.
let url1 = Bundle.main.bundleURL.appendingPathComponent("music1.mp3")
let url2 = Bundle.main.bundleURL.appendingPathComponent("music2.mp3")
let url3 = Bundle.main.bundleURL.appendingPathComponent("music3.mp3")
@IBOutlet weak var yourButton: customButton!
@IBOutlet weak var yourButton2: customButton!
@IBOutlet weak var yourButton3: customButton!
@IBOutlet weak var yourButton4: customButton!
fileprivate var player1:AVAudioPlayer?
fileprivate var player2:AVAudioPlayer?
fileprivate var player3:AVAudioPlayer?
@IBAction func pushButton1(sender: UIButton) {
Player(url: url1)
}
@IBAction func pushButton2(sender: UIButton) {
Player1(url: url2)
}
@IBAction func pushButton3(_ sender: UIButton) {
Player2(url: url1, url2: url2, url3: url3)
}
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
if (player === player1) {
yourButton.isSelected = false
} else if (player === player2) {
yourButton2.isSelected = false
} else if (player === player3) {
yourButton.isSelected = false
player2!.play()
yourButton2.isSelected = true
player2!.play()
yourButton3.isSelected = true
player1!.play()
}
}
func Player(url: URL) {
do {
try player1 = AVAudioPlayer(contentsOf:url)
player1!.play()
yourButton.isSelected = true
player1!.delegate = self
} catch {
print(error)
}
}
func Player1(url: URL) {
do {
try player2 = AVAudioPlayer(contentsOf:url)
player2!.play()
yourButton2.isSelected = true
player2!.delegate = self
} catch {
print(error)
}
}
func Player2(url: URL, url2: URL, url3: URL) {
do {
try player3 = AVAudioPlayer(contentsOf:url)
try player2 = AVAudioPlayer(contentsOf: url2)
try player1 = AVAudioPlayer(contentsOf: url3)
player3!.play()
yourButton.isSelected = true
player3!.delegate = self
player2!.delegate = self
player1!.delegate = self
} catch {
print(error)
}
}
推荐答案
请勿在VC中使用这3种不同的
Don't use this 3 different in VC
fileprivate var player1:AVAudioPlayer?
fileprivate var player2:AVAudioPlayer?
fileprivate var player3:AVAudioPlayer?
在AppDelegate中仅使用其中之一,并从VC访问它,这样就不会出现相同的问题.当下一个音频播放时,上一个音频将停止
Instead of this use only one of this in AppDelegate and access it from your VC so you won't have same issue. When next audio will play previous audio will stop
在App委托中使用它:
Use this in App delegate:
var player1:AVAudioPlayer?
在VC中再次使用此实例
Again in your VC use this instance
func Player1(url: URL) {
do {
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
try appDelegate.player1 = AVAudioPlayer(contentsOf:url)
appDelegate.player1!.play()
yourButton2.isSelected = true
appDelegate.player1!.delegate = self
} catch {
print(error)
}
}
这篇关于如何在audioPlayerDidFinishPlaying方法中多个play()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!