繁体   English   中英

Swift 3:每次加载视图控制器时,背景音乐都会再次播放

[英]Swift 3: Background music plays again every time the view controller loads

视图控制器加载后,我的背景音乐就会播放。 很棒,但是每次用户返回该屏幕时,它都会再次播放。 并陷入混乱的混乱之中。 我需要音乐播放一次并继续播放,直到用户在设置中将其关闭为止。

据我所写的代码了解。 加载视图后,将创建audioPlayer ,然后检查布尔值isPlaying是否设置为false 如果是,则执行playMusic函数。 如果将其设置为true ,则什么都不做。 我很困惑为什么它要在上一个迭代的顶部再次播放音乐。

每次加载视图时会创建音频播放器吗? 如果是这样,我将如何解决?

加载应用后,系统会向用户显示开始屏幕。 音乐开始在那里播放。

然后,他们按开始,购买提示或设置。 为了返回上一个屏幕,您点击了返回按钮。 设置应用程序设计的方式始终可以带您回到开始屏幕。 只是在那建立了话题。 我将控件拖动到下一个视图控制器,然后选择show选项。

import UIKit
import AVFoundation

class ViewController: UIViewController {

    var audioPlayer = AVAudioPlayer()

    @IBOutlet weak var  musicToggle: UIButton!

    var isPlaying = false

    @IBAction func musicTogglebtn(_ sender: Any) {

    }

    override func viewDidLoad() {
        super.viewDidLoad()

        do {
            audioPlayer = try AVAudioPlayer(contentsOf: URL.init(fileURLWithPath: Bundle.main.path(forResource: "weiss", ofType: "mp3")!))
            audioPlayer.prepareToPlay()
        } catch {
            print(error)
        }

        if isPlaying == false {
            playMusic()
        } else {
            return
        }
    }

    func playMusic() {
        audioPlayer.play()
        isPlaying = true
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

您没有提供的关键信息是用户如何进入和离开此屏幕?

如果您在其顶部展示/推动另一个视图控制器,并且用户关闭/弹出该视图控制器,则带有音频播放器的视图控制器将显示出来,并且其状态仍保持不变。

如果您弹出/关闭您的ViewController ,然后展示一个新控制器,或者在前一个控制器上继续推/展示一个新副本,则每个视图控制器将具有其自己的状态以及自己的音频播放器,因此您将获得更多的功能。彼此叠加播放更多声音。

我的猜测是您的问题。

发布有关用户如何导航视图控制器的信息,我们可以帮助您进行分类。

编辑:

根据您的答复,我现在了解您的问题。

声音播放问题是更大问题的征兆。 您已经设置了“后退”按钮来触发节目搜索。 这将创建视图控制器的另一个全新副本,该副本将添加到导航堆栈的顶部。 这是错误的,并且会导致很多问题。

您应该设置导航控制器以显示导航栏。 当您执行此操作时,它将为您设置一个后退按钮,该后退按钮将使前视图控制器从堆栈中弹出,并露出下面的一个。 这是后退按钮的预期行为。

如果相反,您希望后退按钮一直带您进入开始屏幕,则应从后退按钮中删除segue链接,然后将其连接到IBAction ,该IBAction将消息popToRootViewController发送到导航控制器。

这将导致您的下一个问题,即单击“后退”按钮时,您将关闭当前的视图控制器并失去对音频播放器的访问权限。

您可能应该将声音播放控件移至中央声音管理器对象。 对于单例来说,这将是一个很好的用途。 (查找。)将方法添加到声音管理器单例中,以使您可以开始和停止声音,并在显示视图控制器时调用声音播放方法,并在希望停止播放声音时停止播放声音。

每次通话均意味着查看“加载负荷”,请务必考虑如何呈现屏幕。 例如,假设您正在ViewController A中执行此操作,然后移至View ControllerB。现在,如何从View Controller B转到A很重要。 如果您再次在此之上显示View Controller A,则将再次加载View Did Load。 否则,如果您弹出或关闭视图控制器并进入视图控制器A,则它将不会加载。

当您导航到ViewController时isPlaying始终为false,您需要确保isPlaying可以全局访问,或者可以使用Swift_3中的dispatch_once GCD引用此文档Dispatch一次

或者,您甚至可以尝试将isPlaying作为属性共享一个类,但这并不完全干净。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM