首页 > 解决方案 > Swift4:如何解决“致命错误:无法使用 upperBound < lowerBound 形成范围”?(UI中的持续时间延迟)

问题描述

我尝试使用动画以动画方式关闭菜单,当尺寸减小到我想要的值时,我决定减小UIScrollView按下按钮的尺寸,然后将其隐藏。

为了在某​​些时候根据我想要的用户界面完成任务,我使用了“时间延迟功能”(给定 300 毫秒)

一切顺利:如果我没有一次又一次地按下按钮直到达到时间限制

发生错误:当我在 300 毫秒内一次又一次按下按钮时

func disAppearBlanceMenu(){
    let x1 = btn_addBalance.clickableimg.frame.midX
    let y1 = btn_addBalance.clickableimg.frame.maxY

    UIView.animate(withDuration: 0.3) {
        self.BalanceMenu.scrollview.frame = CGRect(x: x1 - 150, y: y1 + 20, width: 200, height: 20)
    }
    time.delay(milliSec: 300) {
        self.BalanceMenu.triangle.isHidden = true
        self.BalanceMenu.scrollview.isHidden = true
        for i in 0...(self.BalanceMenuBtn.count - 1) {
            self.BalanceMenuBtn[i].imag.removeFromSuperview()
            self.BalanceMenuBtn[i].button.removeFromSuperview()
        }
        self.BalanceMenuBtn.removeAll()

    }
    displayBalanceMenu = true
}

在哪里

class time {
    static func delay(milliSec:Int, code: @escaping () -> Void ) {
        let deadline = DispatchTime.now() + .milliseconds(milliSec)
        DispatchQueue.main.asyncAfter(deadline: deadline) {
            code()
        }
    }
}

错误发生在这里:

time.delay(milliSec: 300) {

它说

'线程 1:致命错误:无法形成具有上界 < 下界的范围'

标签: iosswifttimeswift4fatal-error

解决方案


在您的代码中,您应该在执行 for 循环之前添加一个条件,如下所示:

time.delay(milliSec: 300) {
            self.BalanceMenu.triangle.isHidden = true
            self.BalanceMenu.scrollview.isHidden = true
       if self.BalanceMenuBtn.count > 0 {
            for i in 0...(self.BalanceMenuBtn.count - 1) {
                self.BalanceMenuBtn[i].imag.removeFromSuperview()
                self.BalanceMenuBtn[i].button.removeFromSuperview()
            }
           self.BalanceMenuBtn.removeAll()
       }
    }

在 for 循环中,下限大于上限时会出现此错误。在您的代码中,当第一次动画完成时,数组的计数将为 0,第二次条件将是这样的

for I in 0...-1

这就是为什么您会发生崩溃,并且通过检查我的回答中显示的计数条件,这不会崩溃。

希望这可以帮助。


推荐阅读