swift - AVAudioplayer 没有在 viewDidAppear 上重置

标签 swift ios11

这个想法很简单,我认为这个问题过去没有被问过。 我想构建一个简单的 mp3 播放器。

  • 一些歌曲显示在收藏 View 中,用户选择一首歌曲
  • 使用播放、暂停或停止选项切换到另一个 View (仅出现问题) 是当您返回主屏幕选择一首新歌曲时 目前仍在播放。无法停用当前的 玩家。当您需要播放 2 首歌曲时,这两首歌曲一起播放

我尝试了很多事情 - 创建一个新的播放器实例(player = AVAudioPlayer()) -player.pause() 和player.play() 我真的不明白我做错了什么。

这是我的代码:

导入UIKit 导入AVFoundation

LecteurViewController 类:UIViewController {

var chansonSelected: Chanson? = nil
var lecteur:AVAudioPlayer = AVAudioPlayer()
var timer1 = Timer()
var timer2 = Timer()
@IBOutlet weak var dureeChansonSlider: UISlider!
@IBOutlet weak var chansonImageView: UIImageView!
@IBOutlet weak var chansonVolumeSlider: UISlider!
@IBOutlet weak var debutLabel: UILabel!
@IBOutlet weak var finLabel: UILabel!

@IBAction func stopMusicAction(_ sender: UIBarButtonItem) {
    var player = AVAudioPlayer()
    lecteur.stop()
    LecteurManager.isActive = false
}

@IBAction func pauseMusicAction(_ sender: UIBarButtonItem) {
    var player = AVAudioPlayer()
    lecteur.pause()
    LecteurManager.isActive = false
}

@IBAction func jouerMusicAction(_ sender: UIButton) {

    if LecteurManager.isActive {
        changeSong()
        print("lecteur déjà en cours")
    } else {
        var player = AVAudioPlayer()
        lecteur.play()
    }

    print(LecteurManager.isActive )
    LecteurManager.isActive = true
}

func changeSong() {
    lecteur.stop()
    //lecteur = AVAudioPlayer()

    jouerLecteurMp3()
    print(chansonSelected!)
    lecteur.play()
}



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

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    jouerLecteurMp3()
}

func configureView() {

    self.title = (chansonSelected!.titre!).capitalized
    chansonImageView.image = UIImage(named: "\(chansonSelected!.image).jpgs")

    //formatter 'back' button
    let backBtn = UIBarButtonItem(title: "< Playlist", style: .plain, target: self, action: #selector(LecteurViewController.reset(_sender:)))

    self.navigationItem.leftBarButtonItem = backBtn
    self.navigationController?.navigationBar.tintColor = UIColor.white

    //contrôler volume chanson
    chansonVolumeSlider.addTarget(self, action: #selector(LecteurViewController.ajusterVolume(_ :)), for: UIControlEvents.valueChanged)

    //contrôler durée chanson
    dureeChansonSlider.addTarget(self, action: #selector(LecteurViewController.ajusterDurée(_ :)), for: UIControlEvents.valueChanged)

    updateUI()
}

func updateUI() {
    //indiquer position chanson
    timer1 = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(LecteurViewController.mettreAJourDurée), userInfo: nil, repeats: true)

    //afficher durée chanson
    timer2 = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(LecteurViewController.afficherDurée), userInfo: nil, repeats: true)
}

func reset(_sender:UIBarButtonItem) {
    self.navigationController?.popViewController(animated: true)
}

func ajusterVolume(_ sender:UISlider) {
    //print("volume ajusté \(chansonVolumeSlider.value)")
    lecteur.volume = chansonVolumeSlider.value
}

func ajusterDurée(_ sender:UISlider) {
    lecteur.currentTime = TimeInterval(dureeChansonSlider.value)
}

func mettreAJourDurée() {
    dureeChansonSlider.value = Float(lecteur.currentTime)
}

func afficherDurée() {
    print("durée actuelle: \(lecteur.duration - lecteur.currentTime)")
    debutLabel.text = retournerPositionActuelle()
    finLabel.text = retournerDureeTotal()

}

func retournerPositionActuelle() -> String {
    let seconds = Int(lecteur.currentTime) % 60
    let minutes = (Int(lecteur.currentTime) / 60) % 60

    return String(format: "%0.2i:%0.2i", minutes, seconds)
}

func retournerDureeTotal() -> String {
    let seconds = Int(lecteur.currentTime) % 60
    let minutes = (Int(lecteur.currentTime) / 60) % 60
    return String(format: "%0.2i:%0.2i", minutes, seconds)
}

func jouerLecteurMp3() {
    let chanson = "bensound-\(chansonSelected!.titre!)"
    let fichierMp3 = Bundle.main.path(forResource: chanson, ofType: "mp3")

    do {
        try lecteur = AVAudioPlayer(contentsOf: URL(string: fichierMp3!)!)
        dureeChansonSlider.maximumValue = Float(lecteur.duration)

    } catch {
        print("erreur lecture mp3")
    }
}

}

最佳答案

试试这个:

func reset(_sender:UIBarButtonItem) 
{
    self.navigationController?.popViewController(animated: true)
    lecteur.stop()
}

关于swift - AVAudioplayer 没有在 viewDidAppear 上重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46145898/

相关文章:

core-motion - 在 IOS 11 中,后台的 DeviceMotion 停止工作

swift - 蓝色条,iOS11 背景变化中的位置更新

audio - iOS 11 WKWebView 应用程序在播放音频时从 Watchdog 获取 SIGKILL

ios - 恢复购买 : Non-Consumable

ios - Swift 4.2 中带有 JSON 数据的 TableView

swift - 尝试进行涉及 webview 的 UI 测试时 Xcode 崩溃

swift - 使用 NSBezierPath 绘制一个点

ios - Cloud AMPQ 与 iOS APP 集成

iOS 11 UINavigationBar 搞砸了