ios - How do I get music to persist as I navigate from view to view? -


so, have mastered art of playing sounds/music using 1 view in ios, trying make more robust app musical artist. far, involves segues "menu" viewcontroller bio, show times, , "listening room" etc. far, created "audiomanager" class:

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 or die", "caf"], ["hell&backcaf/06 divided", "caf"]]      func buttonplay(song: nsstring, type: nsstring) {          error = nil          musicaudiopath = nsbundle.mainbundle().pathforresource(song string, oftype: type 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")     }    } 

i used in 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()         }     }  } 

but when navigate other 'page' of app, music stops. after researching, know going wrong, can't seem figure out need keep audio playing until app closed or user presses stop (which not exist yet, know). thoughts??

you're going have make audiomanager class singleton. happening, audiomanager instance you're creating being deallocated once navigate away view created in. singleton object created once first accessed, , persist in memory until application's lifecycle ends or explicitly deallocated. more information on swift singletons, check out this page. it's useful pattern learn.

make following modifications audiomanager (taken above website):

private let _audiomanagersharedinstance = audiomanager()  class audiomanager {     static let sharedinstance = audiomanager() } 

access audiomanager using audiomanager.sharedinstance, example can call audiomanager.sharedinstance.previoustrack().