我有一个显示全屏细胞的集合视图。当细胞自动逐个滚动时。当滚动发生时,播放的音频文件取决于单元格的索引号。这部分没有问题。但我的问题是我有一个后退按钮,当用户点击它时,用户进入主视图控制器。这个后退按钮有一个放松的segue。当我点击后退按钮时,我会转到主视图控制器,但是当集合视图单元格滚动时,播放的音频文件会一直播放。
我试过这个但是没有用
@IBAction func backBtnPressed(_ sender: UIButton) {
if audioPlayer1.isPlaying == true {
audioPlayer1.stop()
}
我在调用viewDidLoad()
override func viewDidLoad() {
startTimer()
}
这是部件句柄自动滚动到下一个单元格。我在这里打电话给alphabetSoundPlay()
。
func scrollToNextCell(){
let cellSize = CGSize(width: self.view.frame.width, height: self.view.frame.height)
let contentOffset = myCollectionView.contentOffset
myCollectionView.scrollRectToVisible(CGRect(x: contentOffset.x + cellSize.width, y: contentOffset.y, width: cellSize.width, height: cellSize.height), animated: true)
alphabetSoundPlay()
}
滚动延迟3秒
func startTimer() {
_ = Timer.scheduledTimer(timeInterval: 3.0,
target: self,
selector: #selector(scrollToNextCell),
userInfo: nil,
repeats: true)
}
这是函数计算出它是哪个单元格以及将播放哪个音频文件
func alphabetSoundPlay() {
let currentRow = self.myCollectionView.indexPath(for: self.myCollectionView.visibleCells[0])?.row
if currentRow == 0 {
do
{
audioPlayer1 = try AVAudioPlayer(contentsOf:alphabetSound1!, fileTypeHint:nil)
}
catch
{
return print("file not found")
}
audioPlayer1.prepareToPlay()
audioPlayer1.play()
} else if currentRow == 1 {
do
{
audioPlayer2 = try AVAudioPlayer(contentsOf:alphabetSound2!, fileTypeHint:nil)
}
catch
{
return print("file not found")
}
audioPlayer2.prepareToPlay()
audioPlayer2.play()
}else if currentRow == 2 {
do
{
audioPlayer3 = try AVAudioPlayer(contentsOf:alphabetSound3!, fileTypeHint:nil)
}
catch
{
return print("file not found")
}
audioPlayer3.prepareToPlay()
audioPlayer3.play()
}else if currentRow == 3 {
do
{
audioPlayer4 = try AVAudioPlayer(contentsOf:alphabetSound4!, fileTypeHint:nil)
}
catch
{
return print("file not found")
}
audioPlayer4.prepareToPlay()
audioPlayer4.play()
}
答案 0 :(得分:0)
我认为unwind()
函数不会释放你的viewController实例。您不能再在技术上访问viewController实例,但它的内存实例仍保留在内存中,让您的AudioPlayer继续播放。尝试使用
self.dismiss(animated: true, completion: {
[unowned self] () -> Swift.Void in
self.yourPlayer.stop();
self.yourPlayer = nil;
})
或在unwind()
segue函数中停止并取消分配audioPlayers。
答案 1 :(得分:0)
在prepareForSegue方法
中使用这些行if audioPlayer1.isPlaying == true {
audioPlayer1.stop()
还要确保你在当前正在播放的同一个音频播放器实例上调用stop()方法。