UILabels и UISlider для времени песни не обновляются в музыкальном проигрывателе Mac Catalyst

Недавно я создал простое музыкальное приложение, которое отлично работает на моем деактивированном iPhone. С тех пор я купил Mac mini, чтобы запускать его изначально на этой платформе с Mac Catalyst. Пока что он адаптировался хорошо, но UILabels и UISlider ставят меня в тупик из-за прошедшего и оставшегося времени воспроизведения, которое не обновляется. Я исследовал проблему на прошлой неделе здесь, но решение еще не помогло. К ним относятся вызов строковых переменных при активации контроллера представления и обновление меток в основном потоке.

Вызываю таймер в viewDidLoad:

        timer2 = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(self.tick), userInfo: nil, repeats: true)

Функция галочки представляет собой метку часов, которая отображает текущее время:

    @objc func tick() {
        let date = Date()
        labelTime.text = DateFormatter.localizedString(from: date, dateStyle: .none, timeStyle: .medium)

Он также управляет двумя метками прошедшего и оставшегося времени и ползунком времени:

        if let curTrack = mp.nowPlayingItem {
            //Call length of track in seconds
            let trackDuration = curTrack.playbackDuration
            //Get elapsed time by calling currentPlaybackTime
            let trackElapsed = mp.currentPlaybackTime
            // avoid crash
            if trackElapsed.isNaN
            {
                return
            }

            // Display running time
            let trackElapsedMins = Int(trackElapsed / 60)
            let trackElapsedSecs = Int(trackElapsed.truncatingRemainder(dividingBy: 60))
            if trackElapsedSecs < 10 {
                labelElapsed.text = "\(trackElapsedMins):0\(trackElapsedSecs)"
            } else {
                labelElapsed.text = "\(trackElapsedMins):\(trackElapsedSecs)"
            }
            //Display remaining time: subtract elapsed from duration
            let trackRemaining = Int(trackDuration) - Int(trackElapsed)
            let trackRemainingMins = trackRemaining / 60
            
            let trackRemainingSecs = trackRemaining % 60
            
            if trackRemainingSecs < 10 {
                labelRem.text = "\(trackRemainingMins):0\(trackRemainingSecs)"
            } else {
                labelRem.text = "\(trackRemainingMins):\(trackRemainingSecs)"
            }
            sliderTime.maximumValue = Float(trackDuration)
            sliderTime.value = Float(trackElapsed)
        }

Ярлыки и слайдер - это ваши стандартные точки выхода:

    @IBOutlet weak var labelTime: UILabel!
    @IBOutlet weak var labelElapsed: UILabel!
    @IBOutlet weak var labelRem: UILabel!
    @IBOutlet weak var sliderTime: UISlider!

Я вижу, что функция работает, потому что часы точно отсчитывают секунды, и все переменные содержат данные, когда я вставляю точки останова, но метки и ползунок отображают только время воспроизведения в приложении Музыка, когда мое приложение запускается, и ничего более. Ползунок будет перемещаться к разным точкам в песне при манипуляциях, но никогда не обновляется после этого. Итак, мой вопрос: что может препятствовать этим операциям обновления в Mac Catalyst?


person TCollette    schedule 19.02.2021    source источник


Ответы (1)


Что бы это ни стоило, теперь я уверен, что проблема заключается не в Catalyst, а в крайне отсутствующем API музыкального приложения, который, кажется, вызывает только правильный currentPlaybackTime при инициализации или паузе, в противном случае его значение возвращается к 0. Я установил приложение на мой активный iPhone под управлением iOS 14, и у него такая же проблема. Возможно, это будет исправлено в следующем выпуске, но, учитывая жалобы здесь и в других местах на подобные проблемы, возникшие много месяцев назад, я не задерживаю дыхание ... ОБНОВЛЕНИЕ: Для тех, кто в аналогичных затруднениях, кто обнаружил этот пост ищет решение, вот мой обходной путь ... После отказа от идей для отдельного таймера (слишком неточно) и моста AppleScript для возврата значения свойства позиции игрока (что, вероятно, невозможно в Mac Catalyst), я обнаружил, что currentPlaybackTime обновляется каждый раз Я нажал кнопку воспроизведения. Итак, я построил эту функцию

@objc func playTime() -> Double {
        let trackElapsed = mp.currentPlaybackTime
       if isPlaying == true {
           mp.play()
       }
        return trackElapsed
    }

который отправляет команду play каждую секунду, пока переменная isPlaying истинна, и, таким образом, возвращает обновленное значение положения точки воспроизведения моим меткам и ползункам. Задача решена…

person TCollette    schedule 21.02.2021