2016-12-17 2 views
0

Ich habe eine Sammlungsansicht, die Vollbildzellen anzeigt. Und wenn Zellen automatisch nacheinander scrollen. Beim Scrollen spielt eine Audiodatei abhängig von der Indexnummer der Zelle. Es gibt kein Problem mit diesem Teil. Aber mein Problem ist, dass ich eine Zurück-Taste habe und wenn der Benutzer darauf tippt, geht der Benutzer zum Hauptansicht-Controller. Und dieser Zurück-Knopf hat einen Abwickel-Übergang. Wenn ich auf die Zurück-Schaltfläche tippe, gehe ich zum Hauptansicht-Controller, aber die Audiodatei, die abgespielt wird, wenn die Zellen der Sammlungsansichtszelle weiterlaufen, wird immer wieder abgespielt.Unwind segue und Audio spielt weiter

Ich habe dies versucht, aber es funktioniert nicht

@IBAction func backBtnPressed(_ sender: UIButton) { 
     if audioPlayer1.isPlaying == true { 
     audioPlayer1.stop() 
    } 

Und ich alles nenne innen viewDidLoad()

override func viewDidLoad() { 
      startTimer() 
     } 

Dies ist der Teil scrollt automatisch in die nächste Zelle behandelt. Und ich rufe alphabetSoundPlay() Funktion hier.

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-Sekunden-Verzögerung für

Scrollen
func startTimer() { 

     _ = Timer.scheduledTimer(timeInterval: 3.0, 
     target: self, 
     selector: #selector(scrollToNextCell), 
     userInfo: nil, 
     repeats: true) 
    } 

Dies ist die Funktion findet heraus, welche Zelle sie ist, und dem Audio-Datei wird

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() 
     } 

Antwort

0

spielen Ich denke unwind() Funktion ausplanen nicht Ihre ViewController-Instanz. Sie können nicht mehr auf die ViewController-Instanz zugreifen, aber die Speicherinstanz bleibt im Speicher und der AudioPlayer spielt weiter. Versuchen

self.dismiss(animated: true, completion: { 
    [unowned self]() -> Swift.Void in 
    self.yourPlayer.stop(); 
    self.yourPlayer = nil; 
}) 

mit oder stoppen und ausplanen Ihre audioPlayers in Ihrem unwind() segue Funktion.

0

Verwenden Sie diese Zeilen in prepareForSegue Methode

if audioPlayer1.isPlaying == true { 
    audioPlayer1.stop() 

Und auch sicher sein, dass Sie stop() -Methode auf derselben Instanz von Audio-Player aufrufen, die gerade abgespielt wird.

Verwandte Themen