尝试将 maximumValue 设置为 UISlider 时应用程序崩溃

App Crashes when try to set the maximumValue to the UISlider

当我尝试播放视频时,出现以下异常。

*** Assertion failure in -[CustomSlider _setValue:minValue:maxValue:andSendAction:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKitCore/UIKit-3698.119.2/UISlider.m:1477

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempting to set a slider's minimumValue (0.000000) to be larger than the maximumValue (nan)'

libc++abi.dylib: terminating with uncaught exception of type NSException

这是我的代码:

当我在 iOS 13 设备上 运行 时这段代码工作正常,但当我在 iOS 12.3.1 设备上 运行 时崩溃.

SDK: iOS 13
工具: XCode 11.3.1
目标设备: iPhone 6S Plus 运行ning iOS 12.3.1

func updateUIforPlayerItemStatus() {
    guard let currentItem = player.currentItem else { return }
    
    switch currentItem.status {        
    case .readyToPlay:
        playPauseButton.isEnabled = true
        guard player.currentItem!.duration >= CMTime.zero else {
            return
        }
        
        let newDurationSeconds = Float(currentItem.duration.seconds)
        
        let currentTime = Float(player.currentTime().seconds)
        timeSlider.minimumValue = 0.0
        timeSlider.maximumValue = newDurationSeconds
        timeSlider.value = currentTime
        timeSlider.isEnabled = true
        durationLabel.isEnabled = true
        durationLabel.text = createTimeString(time: newDurationSeconds)
        player.playImmediately(atRate: playbackRate)            
        
    default:
        playPauseButton.isEnabled = false
        timeSlider.isEnabled = false
        durationLabel.isEnabled = false
    }
}

滑块的最大值为 nan,这意味着您的 avPlayer 的持续时间是不确定的,您可以使用以下方法进行估算:

    let newDurationSeconds = Float(currentItem.asset.duration.seconds ?? 00)

错误信息说maximumValue是NaN(not-a-number),也就是说newDurationSeconds不是一个数字,也就是说currentItem.duration.seconds不是一个数字。在使用之前检查以确保它不是 NaN,如下所示:

[...]
guard currentItem.duration >= .zero, !currentItem.duration.seconds.isNaN else {
    return
}

let newDurationSeconds = Float(currentItem.duration.seconds)

[...]

当duration为.Nan时出现此错误,使用此代码修复

        if let duration = musicPlayer.instance.player.currentItem?.duration {
            guard duration.isNaN else {
                return
            }
            let seconds : Float64 = duration
        self.sliderAudio.maximumValue = Float(seconds)
        }