Как я могу отслеживать текущую позицию AVMIDIPlayer, пожалуйста? - PullRequest
1 голос
/ 02 мая 2020

Я пытаюсь сделать из простого игрока c музыкантов. Я хочу, чтобы метка отображала текущую позицию AVMIDIPlayer. С моим кодом метка обновляется только один раз в самом начале:

import UIKit
import AVFoundation
class ViewController: UIViewController {
    var player:AVMIDIPlayer = AVMIDIPlayer()
    var playerTime:Double = 999 {
        didSet {
            label.text = String(playerTime)
        }
    }

    @IBOutlet var label: UILabel!
    @IBAction func Play(_ sender: Any) {
        player.play()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        do {
            let audioPath = Bundle.main.path(forResource: “song”, ofType: "mid")
            try player = AVMIDIPlayer(contentsOf: NSURL(fileURLWithPath: audioPath!) as URL, soundBankURL: nil)
            playerTime = player.currentPosition
        }
        catch {
        }
    }
}

Что я пропустил, пожалуйста? Спасибо. Scarlett

1 Ответ

1 голос
/ 02 мая 2020

Причина, по которой ярлык не обновляется, заключается в том, что вы устанавливаете текст в viewDidLoad, который вызывается только один раз. Используйте Timer для обновления метки.

import UIKit
import AVFoundation
class ViewController: UIViewController {
    var player:AVMIDIPlayer = AVMIDIPlayer()
    var playerTime:Double = 999 {
        didSet {
            label.text = String(playerTime)
        }
    }
    var timer = Timer()

    @IBOutlet var label: UILabel!
    @IBAction func Play(_ sender: Any) {
        player.play()

        // this will execute every 0.1 seconds, allowing you to update the label.
        timer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { _ in
            self.playerTime += 0.1

            let min = self.playerTime.truncatingRemainder(dividingBy: 3600)) / 60
            let sec = self.playerTime.truncatingRemainder(dividingBy: 60)

            self.label.text = String(format: "%02d:%02d", min, sec)
        }
    }

    func stop() {
        // when you stop playback
        timer.invalidate()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        do {
            let audioPath = Bundle.main.path(forResource: “song”, ofType: "mid")
            try player = AVMIDIPlayer(contentsOf: NSURL(fileURLWithPath: audioPath!) as URL, soundBankURL: nil)
            playerTime = player.currentPosition
        }
        catch {
        }

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...