Swift 在不同的ViewController中停止音频播放器

Swift 在不同的ViewController中停止音频播放器,swift,avaudioplayer,viewcontroller,Swift,Avaudioplayer,Viewcontroller,我有一个主菜单声音文件在AVAudioPlayer中播放 我想创建一个选项按钮,将我带到另一个视图控制器。当我点击开关时,可以选择关闭主菜单声音。如何停止音频播放 如何在不同的ViewController中访问音频播放器 如果你需要更多信息,请告诉我。谢谢 您可以将音频播放器创建为一个类,并实例化该类的共享实例 class PageDataSource { var page: Int? var angels = [Angel]() var angelsToSave = [

我有一个主菜单声音文件在AVAudioPlayer中播放

我想创建一个选项按钮,将我带到另一个视图控制器。当我点击开关时,可以选择关闭主菜单声音。如何停止音频播放

如何在不同的ViewController中访问音频播放器


如果你需要更多信息,请告诉我。谢谢

您可以将音频播放器创建为一个类,并实例化该类的共享实例

class PageDataSource {
    var page: Int?
    var angels = [Angel]()
    var angelsToSave = [Int]()
    var myName: String?

    static let sharedInstance = PageDataSource()
    private init() {}
}
使用该sharedInstance,您可以在所有视图中调用该对象并在其中编辑该对象。我只将它用作在所有视图之间共享数据的一种方式,但我认为您可以使用它来完成所需的工作。以下是它的工作原理示例:

  class HomeViewController: UIViewController {
        override func viewDidLoad() {
            PageDataSource.sharedInstance.page = 1
     }
}
一旦运行,就可以从应用程序中的任何位置访问这些数据。您可以通过调用printPageDataSource.sharedInstance.page来测试它

另一种选择是将音频播放器的所有代码都放在一个公共类的扩展中,就像UIViewController的自定义实现一样。如果这样做,您可以在任何支持AVAudioPlayer框架导入、委托等的UIViewController中调用所需的所有函数

对于我使用的警报,我经常这样做:

extension: UIViewController {

    func doCrudAlert(_ title: String, _ message: String, _ button: String, _  completion: (() -> Swift.Void)? = nil)  {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        let buttonAction = UIAlertAction(title: button, style: .default) { (action) in
            completion?()
            return
        }
        alert.addAction(buttonAction)
        present(alert, animated: true, completion: nil)
    }
}

有了这段代码,我可以调用docrudalertitle字符串,Message!!!!,按钮标题,nil,从任何UIViewController创建音频播放器作为一个类,并实例化该类的共享实例

class PageDataSource {
    var page: Int?
    var angels = [Angel]()
    var angelsToSave = [Int]()
    var myName: String?

    static let sharedInstance = PageDataSource()
    private init() {}
}
使用该sharedInstance,您可以在所有视图中调用该对象并在其中编辑该对象。我只将它用作在所有视图之间共享数据的一种方式,但我认为您可以使用它来完成所需的工作。以下是它的工作原理示例:

  class HomeViewController: UIViewController {
        override func viewDidLoad() {
            PageDataSource.sharedInstance.page = 1
     }
}
一旦运行,就可以从应用程序中的任何位置访问这些数据。您可以通过调用printPageDataSource.sharedInstance.page来测试它

另一种选择是将音频播放器的所有代码都放在一个公共类的扩展中,就像UIViewController的自定义实现一样。如果这样做,您可以在任何支持AVAudioPlayer框架导入、委托等的UIViewController中调用所需的所有函数

对于我使用的警报,我经常这样做:

extension: UIViewController {

    func doCrudAlert(_ title: String, _ message: String, _ button: String, _  completion: (() -> Swift.Void)? = nil)  {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        let buttonAction = UIAlertAction(title: button, style: .default) { (action) in
            completion?()
            return
        }
        alert.addAction(buttonAction)
        present(alert, animated: true, completion: nil)
    }
}

有了这段代码,我可以调用docrudalertitle字符串,Message!!!!,任何UIViewController中的按钮标题,无创建一个单例类,在其中添加播放机并从以下位置控制它:

import AVFoundation

class Singleton {
    static let sharedInstance = Singleton()
    private var player: AVAudioPlayer?

    func play() {
        guard let url = Bundle.main.url(forResource: "Sound", withExtension: "mp3") else { return }

        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)

            player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)

            guard let player = player else { return }

            player.play()

        } catch let error {
            print(error.localizedDescription)
        }
    }

    func stop() {
        player?.stop()
    }
}
无论何时您想要启动声音,只需呼叫:

Singleton.sharedInstance.play()
Singleton.sharedInstance.stop()
无论何时您想停止声音,只需呼叫:

Singleton.sharedInstance.play()
Singleton.sharedInstance.stop()

这可以从所有控制器调用。

创建一个单例类,在其中添加播放机并从以下位置进行控制:

import AVFoundation

class Singleton {
    static let sharedInstance = Singleton()
    private var player: AVAudioPlayer?

    func play() {
        guard let url = Bundle.main.url(forResource: "Sound", withExtension: "mp3") else { return }

        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)

            player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)

            guard let player = player else { return }

            player.play()

        } catch let error {
            print(error.localizedDescription)
        }
    }

    func stop() {
        player?.stop()
    }
}
无论何时您想要启动声音,只需呼叫:

Singleton.sharedInstance.play()
Singleton.sharedInstance.stop()
无论何时您想停止声音,只需呼叫:

Singleton.sharedInstance.play()
Singleton.sharedInstance.stop()

这可以从所有控制器调用。

谢谢你救了我的命谢谢你救了我的命