放松segue和音频继续播放

时间:2016-12-17 13:20:31

标签: ios swift

我有一个显示全屏细胞的集合视图。当细胞自动逐个滚动时。当滚动发生时,播放的音频文件取决于单元格的索引号。这部分没有问题。但我的问题是我有一个后退按钮,当用户点击它时,用户进入主视图控制器。这个后退按钮有一个放松的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()
        }

2 个答案:

答案 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()方法。