我最近构建了一个简单的音乐应用程序,它在我停用的 iPhone 上运行良好。此后我购买了一台 Mac mini,因此我可以使用 Mac Catalyst 在该平台上本地运行它。到目前为止,它已经适应得很好,但是我被 UILabels 和 UISlider 阻碍,因为经过的和剩余的播放时间没有更新。我在这里研究了上周的问题,但还没有解决方案。这些包括在视图控制器激活时调用字符串变量以及在主线程上更新标签。
我调用了一个计时器viewDidLoad
:
timer2 = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(self.tick), userInfo: nil, repeats: true)
tick 函数显示一个时钟标签,显示当前时间:
@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 中的这些更新操作?