在另一个ViewController中停止AudioPlayer

时间:2018-02-17 05:55:43

标签: swift avaudioplayer viewcontroller

我在AVAudioPlayer中播放主菜单声音文件。

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

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

如果您需要更多信息,请与我们联系。谢谢!

2 个答案:

答案 0 :(得分:2)

创建一个Singleton类,您可以在其中添加播放器并控制它:

SELECT * FROM Arraycheck WHERE 'vin' = ANY (empnames);

每当你想要开始声音时,只需致电:

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()

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

答案 1 :(得分:0)

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

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

    static let sharedInstance = PageDataSource()
    private init() {}
}

使用sharedInstance,你可以在所有视图中调用这个ONE对象并在那里编辑它。我只是用它作为在所有视图之间共享数据的方法,但我认为你可以用它来做你想要的。以下是其工作原理的示例:

  class HomeViewController: UIViewController {
        override func viewDidLoad() {
            PageDataSource.sharedInstance.page = 1
     }
}

只要运行,就可以从应用中的任何位置访问该数据。您可以致电print(PageDataSource.sharedInstance.page!)

进行测试

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

我经常为我使用的alerts执行此操作:

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)
    }
}

使用该位代码,我可以从任何doCrudAlert("Title String", "Message!!!!", "Button Title", nil )

调用UIViewController