ios - AVAudioPlayer 在转场后继续播放并在返回原始 View Controller 时重新启动 - 我怎样才能停止它?

标签 ios xcode swift

我的 AVAudioPlayer 有一个奇怪的小问题,我找不到一个很好的整洁的解决方案。我使用以下函数在我的应用程序的菜单屏幕中播放一些背景音乐:

func startMusic() {
    do {
        try musicPlayer = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("menu_music", ofType: "mp3")!))
    } catch let err as NSError {
        print (err.debugDescription)
    }       
    musicPlayer.prepareToPlay()
    musicPlayer.numberOfLoops = -1
    musicPlayer.play()
}

我在viewDidLoad中这样调用它:

   override func viewDidLoad() {
        super.viewDidLoad()            
        startMusic()        
    }

到目前为止一切顺利。

菜单有几个按钮,这些按钮可以通过转场将用户带到其他屏幕,这些转场都是在界面生成器中创建的 - 没有编程转场。

第一个问题是当其他屏幕加载时音乐继续播放。在大多数情况下,这实际上是一个很好的、理想的效果,但我想知道除了创建包含 musicPlayer.stop() 的菜单按钮操作之外,是否有其他方法可以阻止它>musicPlayer.pause()。例如,一个 View Controller 可以停止在另一个 View Controller 中启动的 AVAudioPlayer 吗?

我遇到的更严重的问题是,当我导航回菜单屏幕时(再次通过启动界面生成器创建的segue的按钮),音乐的重复副本开始在原始音乐上播放(声音太可怕了)并且似乎没有任何方法可以阻止它或检查它是否正在播放。如果单击更多菜单选项然后返回,则会开始播放更多音乐副本。

我已经尝试过

if (!musicPlayer.playing) { 
    musicPlayer.play() 
}

if (musicPlayer == nil) { 
    musicPlayer.play() 
}

以及每次停止和启动播放器,但我仍然会得到相同音乐的多个副本相互播放。这就好像有多个同名的音乐播放器无法停止,或者同一 View Controller 的多个副本在后台运行。

我意识到我可能在这里遗漏了一些绝对基本的东西,但谷歌搜索未能为我提供答案,我知道 Stack Overflow 的优秀人员不会让我失望。

谢谢。

最佳答案

在主视图 Controller 的 viewWillDisappear 中,您可以停止您的AVAudioPlayer

例如:

override func viewWillDisappear(animated: Bool) {
    musicPlayer.stop()
}

关于ios - AVAudioPlayer 在转场后继续播放并在返回原始 View Controller 时重新启动 - 我怎样才能停止它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37511952/

相关文章:

objective-c - GPS 航向 iOS

objective-c - 如何在iOS编程中获取时间

objective-c - 如何为代码自动格式化设置 Xcode 插件

ios - XML 到 Xcode 解析

iphone - 如何应对所有贬值

javascript - iPad 上 iframe 中的文本区域行为

ios - 如何在 UNNotificationRequest 中设置重复间隔和触发日期

ios - 如何在应用程序强制退出和应用程序重新启动后恢复 NSURLSession 下载过程?

ios - 从 UIButton 快速呈现 Popover View

json - 不使用 for 语句解析 JSON 数组