当我从视图导航到视图时,如何让音乐持续存在?

所以,我已经掌握了使用iOS中的一种视图来播放声音/音乐的艺术,但是现在我正在尝试为音乐艺术家制作更强大的应用程序。 到目前为止,它涉及从“菜单”ViewController到他的“生物”,“显示时间”和“聆听室”等等。到目前为止,我创build了一个“AudioManager”类:

import UIKit import AVFoundation import MediaPlayer class AudioManager: NSObject { let defaltSong = ["Hell&BackCaf/01 Black Sheep", "caf"] weak var delegate : PlayerDelegate? var musicPlayer1 = AVAudioPlayer() var trackNumber = 0 var musicAudioPath = NSBundle.mainBundle().pathForResource("Hell&BackCaf/01 Black Sheep", ofType: "caf") var musicAudioPathURL = NSURL() var error:NSError? = nil var songList = [["Hell&BackCaf/01 Black Sheep", "caf"], ["Hell&BackCaf/02 Hell & Back", "caf"], ["Hell&BackCaf/03 Save Me", "caf"], ["Hell&BackCaf/04 Broken feat. Hillary Dodson", "caf"], ["Hell&BackCaf/05 Do Or Die", "caf"], ["Hell&BackCaf/06 Divided", "caf"]] func ButtonPlay(song: NSString, type: NSString) { error = nil musicAudioPath = NSBundle.mainBundle().pathForResource(song as String, ofType: type as String) musicAudioPathURL = NSURL(fileURLWithPath: self.musicAudioPath!)! musicPlayer1 = AVAudioPlayer(contentsOfURL: musicAudioPathURL, error: &error) musicPlayer1.prepareToPlay() musicPlayer1.play() } func loadFirstSong() { error = nil musicAudioPath = NSBundle.mainBundle().pathForResource("Hell&BackCaf/01 Black Sheep", ofType: "caf") musicAudioPathURL = NSURL(fileURLWithPath: self.musicAudioPath!)! musicPlayer1 = AVAudioPlayer(contentsOfURL: musicAudioPathURL, error: &error) if error == nil { musicPlayer1.prepareToPlay() } else { println(error) } } func advanceTrack(){ if trackNumber < songList.count - 1 { self.trackNumber++ ButtonPlay(songList[trackNumber][0], type: songList[trackNumber][1]) } else { trackNumber = 0 ButtonPlay(songList[trackNumber][0], type: songList[trackNumber][1]) } } func previousTrack(){ if trackNumber > 0 { trackNumber-- ButtonPlay(songList[trackNumber][0], type: songList[trackNumber][1]) } else { trackNumber = songList.count - 1 ButtonPlay(songList[trackNumber][0], type: songList[trackNumber][1]) } } func audioPlayerDidFinishPlaying(AVAudioPlayer!, successfully: Bool) { self.delegate?.soundFinished(self) println("song over") } } 

然后我在我的MusicRoomViewController中使用它:

 import UIKit import AVFoundation class MusicRoomViewController: UIViewController, AVAudioPlayerDelegate { let audioManager = AudioManager() @IBAction func pressedBackButton(sender: UIButton) { audioManager.previousTrack() } @IBAction func pressedPlayButton(sender: UIButton) { audioManager.musicPlayer1.play() } @IBAction func pressedForwardButton(sender: UIButton) { audioManager.advanceTrack() } override func viewDidLoad() { super.viewDidLoad() audioManager.loadFirstSong() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } override func viewWillDisappear(animated: Bool) { if self.isMovingFromParentViewController() { audioManager.musicPlayer1.play() } } } 

但现在,当我导航到应用程序的任何其他“页面”时,音乐停止。 经过研究,我知道我正在做的这一切都是错误的,但我似乎无法弄清楚我需要做什么来保持audio播放,直到应用程序closures或用户按下停止(这还不存在,我知道)。 有什么想法吗??

你将不得不让你的AudioManager类单身。 发生什么事情是,当你创build的AudioManager实例离开你创build的视图时,你正在创build的AudioManager实例将被释放。一个单例对象在第一次被访问时被创build,并且会一直存在于内存中,直到应用程序的生命周期结束或者它被明确地解除分配。 有关Swift单例的更多信息,请查看此页面 。 这是一个有用的模式学习。

对AudioManager进行以下修改(从以上网站获取):

 private let _AudioManagerSharedInstance = AudioManager() class AudioManager { static let sharedInstance = AudioManager() } 

通过使用AudioManager.sharedInstance访问AudioManager,例如,您可以调用AudioManager.sharedInstance.previousTrack()

你可以创build一个单例,或者在你的AppDelegate类中实例化AudioManager,并像这样引用:

 AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; appDelegate.audioManger...