Недавно я создал простое музыкальное приложение, которое отлично работает на моем деактивированном 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?