在 Mac Catalyst 音乐播放器中未更新歌曲时间的 UILabels 和 UISlider
Posted
技术标签:
【中文标题】在 Mac Catalyst 音乐播放器中未更新歌曲时间的 UILabels 和 UISlider【英文标题】:UILabels and UISlider for song time not updating in Mac Catalyst music player 【发布时间】:2021-02-19 18:13:30 【问题描述】:我最近构建了一个简单的音乐应用程序,它在我停用的 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 中的这些更新操作?
【问题讨论】:
【参考方案1】:对于它的价值,我现在确定问题不在于 Catalyst,而在于严重缺乏的音乐应用 API,它似乎只在初始化或暂停时调用正确的 currentPlaybackTime
,否则它的值会恢复为 0。我在运行 ios 14 的活动 iPhone 上安装了该应用程序,它也有同样的问题。也许这会在未来的版本中得到解决,但鉴于这里和其他地方关于类似问题的抱怨可以追溯到几个月前,我并没有屏住呼吸......
更新:对于那些发现这篇文章寻求解决方案的类似困境的人,这是我的解决方法......
在拒绝使用单独的计时器(太不准确)和 AppleScript 桥来返回播放器位置属性的值(在 Mac Catalyst 中可能不可能)的想法之后,我发现每次点击播放按钮时都会刷新currentPlaybackTime
。所以我建立了这个功能
@objc func playTime() -> Double
let trackElapsed = mp.currentPlaybackTime
if isPlaying == true
mp.play()
return trackElapsed
在isPlaying
变量为真时每秒发送一个play
命令,从而将更新的播放头位置值返回到我的标签和滑块。问题解决了……
【讨论】:
以上是关于在 Mac Catalyst 音乐播放器中未更新歌曲时间的 UILabels 和 UISlider的主要内容,如果未能解决你的问题,请参考以下文章
如何修复“读写数据沙箱:使用 Mac Catalyst 时出错”
为啥我不能在 Mac Catalyst 上创建 AVAudioFile? (错误-54)
Xcode 12.3 Mac Catalyst 代码签名失败(代码对象根本没有签名)