[英]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.