2015-04-28 3 views
2

Итак, я освоил искусство воспроизведения звуков/музыки, используя один вид в iOS, но теперь я пытаюсь создать более надежное приложение для музыкального исполнителя. До сих пор, она включает в себя перетекает из «меню» ViewController к его био, Шоу Times, и «Listening Room» и т.д. До сих пор, я создал класс «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() 
     } 
    } 

} 

Но теперь, когда я перейти к любой другой «странице» из приложения, музыка останавливается. После исследования я знаю, что я все это делаю неправильно, но я не могу понять, что мне нужно сделать, чтобы звук воспроизводился до тех пор, пока приложение не будет закрыто или пользователь не остановит (который еще не существует, Я знаю). Есть предположения??

+0

Попробуйте https://github.com/nicklockwood/SoundManager – PowHu

ответ

1

Вам нужно будет сделать свой класс AudioManager одиночным. Что происходит, создается экземпляр AudioManager, который вы создаете, освобождается после того, как вы перемещаетесь от созданного вами представления. Объект singleton создается после его первого доступа и сохраняется в памяти до тех пор, пока жизненный цикл приложения не закончится или он не будет явно освобождается. Для получения дополнительной информации о синглетах Swift посетите this page. Это полезный образец для изучения.

Внести следующие изменения в AudioManager (взятые из вышеприведенного сайта): AudioManager

private let _AudioManagerSharedInstance = AudioManager() 

class AudioManager { 
    static let sharedInstance = AudioManager() 
} 

доступа с помощью AudioManager.sharedInstance, например, вы можете позвонить AudioManager.sharedInstance.previousTrack().

+0

Да, да, да !! Именно то, что я хотел сделать! Сейчас работает 100%. Супер спасибо за это! – Torsten

+0

Рад, что это сработало! –

0

Вы можете создать синглтон или экземпляр AudioManager в вашем AppDelegate классе и относятся к тому, что как так:

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

appDelegate.audioManger...