0

我最近构建了一个简单的音乐应用程序,它在我停用的 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 中的这些更新操作?

4

1 回答 1

0

对于它的价值,我现在确定问题不在于 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
    }

play当变量为真时每秒发送一个命令isPlaying,从而将更新的播放头位置值返回到我的标签和滑块。问题解决了……</p>

于 2021-02-21T17:04:11.160 回答