我有一个在我的主屏幕上启动的音频播放器

时间:2016-02-28 07:32:29

标签: swift2 xcode7

每当我回到主屏幕时,它会播放已播放音乐的音乐。我尝试制作一个“显然”不起作用的if语句(因为我几乎不知道任何快速!)。这是我的主屏幕代码:

    var myAudioPlayer = AVAudioPlayer()

    override func viewDidLoad() {

    let myFilePathString =
    NSBundle.mainBundle().pathForResource("16 March of the Resistance",     ofType: "m4a")

    if let myFilePathString = myFilePathString
    {
        let myFilePathURL = NSURL(fileURLWithPath: myFilePathString)

        do{
            try myAudioPlayer = AVAudioPlayer(contentsOfURL: myFilePathURL)

            myAudioPlayer.play()
        }catch
        {
            print("error")
        }
    }
}

如何阻止它在自身上面播放?

这是我的故事板的图片

enter image description here

音乐播放器在StartScreen上,但当我点击后退按钮时,它会启动当前音乐播放器上的另一个音乐播放器。

我需要代码

是myAudioPlayer播放?

如果是,请不要再播放歌曲

否则发挥“3月16日的抵抗”

enter image description here

3 个答案:

答案 0 :(得分:0)

你需要检查你是否已经在玩。您可以the playing property of the AVAudioPlayer class完成此操作。

用{:}保护你的viewDidLoad

if !myAudioPlayer.playing

请注意,我不知道任何Swift。

答案 1 :(得分:0)

我不确定你的“我的主屏幕”是什么意思,它是设备还是你的主要VC?你为什么要重写viewDidLoad()?之前的玩家永远不会在viewDidLoad()调用中玩,除非是泄漏,这是需要修复的。

否则,您只需要将播放器声明为可选,而不是在声明中创建它。至于重放或重叠,只需检查您的播放器是否存在,尽管您不会在viewDidLoad()中执行此操作。创建VC视图并加载视图时调用ViewDidLoad(),这与音频的生命周期无关。

根据您的要求,您可能希望在整个应用程序中播放的其他位置创建播放器,而不是在访问该VC时重新启动。否则,下面的代码将避免重复。问题是这个var myAudioPlayer = AVAudioPlayer()会重复玩家而一个没有被释放。

var myAudioPlayer: AVAudioPlayer?

func viewDidLoad() {

    // this should never be needed with correct player setup
    if let player = myAudioPlayer where player.playing {
        return
    }

    if let pathString = NSBundle.mainBundle().pathForResource("16 March of the Resistance", ofType: "m4a")
    {
        let url = NSURL(fileURLWithPath: pathString)
        do{
            try myAudioPlayer = AVAudioPlayer(contentsOfURL: url)
            myAudioPlayer?.play()
        } catch {
            print("error")
        }
    }
}

<强>更新

所以没有必要让VC这样做。创建一个例如AudioController,甚至可以是单身人士。在AppDelegate中初始化它并在初始化后触发此播放器设置代码。您的视图控制器无需了解音频控制器。如果是如果您想从设置页面修改音量,只需访问单例对象并设置其音量即可。

这样,您可以将所有音频控制器代码保持良好分离。不要只考虑功能,考虑整体软件架构,对象具有明确的职责。让ViewControllers保持清晰,他们不应该做很多处理。

看看这个Singletons,现在很容易在Swift中设置单例。

class AudioController {

    static let sharedInstance = AudioController()

    var audioPlayer: AVAudioPlayer?
    let kVolumeKey = "VolumeKey"
    let kHasSavedInitialVolumeKey = "HasSavedInitialVolumeKey"

    var volume: Float = 0.5

    func setup() {
        self.loadVolume()
        self.setupPlayer()
    }

    func updatePlayerVolume(volume: Float) {
        self.audioPlayer?.volume = volume
        self.volume = volume
        self.saveVolume()
    }

    func saveVolume() {
        NSUserDefaults.standardUserDefaults().setBool(true, forKey: kHasSavedInitialVolumeKey)
        NSUserDefaults.standardUserDefaults().setFloat(self.volume, forKey: kVolumeKey)
        NSUserDefaults.standardUserDefaults().synchronize()
    }

    func loadVolume() {
        if NSUserDefaults.standardUserDefaults().boolForKey(kHasSavedInitialVolumeKey) {
            self.volume = NSUserDefaults.standardUserDefaults().floatForKey(kVolumeKey)
        }
    }

    func setupPlayer() {

        if let pathString = NSBundle.mainBundle().pathForResource("16 March of the Resistance", ofType: "m4a")
        {
            let url = NSURL(fileURLWithPath: pathString)
            do{
                try audioPlayer = AVAudioPlayer(contentsOfURL: url)
                audioPlayer?.volume = self.volume
                audioPlayer?.play()
            } catch {
                print("error")
            }
        }
    }
}

所以,你可以从AppDelegate的didFinishLaunching中设置播放器

AudioController.sharedInstance.setupPlayer()

然后,当您需要获取或设置时,可以使用AudioController.sharedInstance.whatever访问AudioController。此外,您需要实现播放器委托处理歌曲结尾的方法,可能会触发播放列表中的新歌曲(为此创建新对象)或其他任何内容。您的播放器委托代码现在也很好地分开了。

答案 2 :(得分:0)

查看故事板时,似乎当您单击第二个ViewController上的“返回”按钮时,您会分配另一个开始屏幕并将其推到屏幕上。
您似乎正在使用UINavigationController,如果这样,当点击后退按钮时,您应该致电:

self.navigationController?.popViewControllerAnimated(true)

如果你把它作为一个模态显示你应该解雇是这样的:

self.dismissViewControllerAnimated(true, completion: nil)