当我从一个视图浏览到另一个视图时,如何使音乐持久化? [英] How do I get music to persist as I navigate from view to view?

查看:87
本文介绍了当我从一个视图浏览到另一个视图时,如何使音乐持久化?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

因此,我已经掌握了在iOS中使用一个视图播放声音/音乐的技巧,但现在我正尝试为音乐艺术家制作一个更强大的应用程序.到目前为止,它涉及到从菜单" ViewController到他的简历,Show Times和"Listening Room"等的搜索.到目前为止,我创建了一个"AudioManager"类:

So, I have mastered the art of playing sounds/music using one view in iOS, but I am now trying to make a more robust app for an musical artist. Thus far, it involves segues from a "menu" ViewController to his Bio, Show Times, and "Listening Room" etc. Thus far, I created a an "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 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中使用了它:

I then used it in my 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 now when I navigate to any other 'page' of the app, the music stops. After researching, I know that I am going about this all wrong, but I can't seem to figure out what I need to do to keep the audio playing until the app is closed or the user presses stop (which does not exist yet, I know). Any thoughts??

推荐答案

您将不得不使AudioManager类成为单例.发生的情况是,一旦您离开创建视图的视图,正在创建的AudioManager实例将被释放.一次访问该对象的对象将创建一次,并将持续存在于内存中,直到应用程序的生命周期结束或消失为止.被显式释放.有关Swift单例的更多信息,请查看 此页面 .这是一种有用的学习模式.

You're going to have to make your AudioManager class a singleton. What is happening, is the AudioManager instance you're creating is being deallocated once you navigate away from the view you created it in. A singleton object is created once it is first accessed, and will persist in memory until the application's lifecycle ends or it is explicitly deallocated. For more information on Swift singletons, check out this page. It's a useful pattern to learn.

对AudioManager进行以下修改(取自上述网站):

Make the following modifications to AudioManager (taken from the above website):

private let _AudioManagerSharedInstance = AudioManager()

class AudioManager {
    static let sharedInstance = AudioManager()
}

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

Access AudioManager by using AudioManager.sharedInstance, for example you can call AudioManager.sharedInstance.previousTrack().

这篇关于当我从一个视图浏览到另一个视图时,如何使音乐持久化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆