Swift4: How to resolve "Fatal error: Can't form Range with upperBound < lowerBound"? (duration time delay in UI)
Swift4: How to resolve "Fatal error: Can't form Range with upperBound < lowerBound"? (duration time delay in UI)
我尝试使用动画动画关闭菜单,
当尺寸减小到我想要的值时,我决定在按下按钮时减小 UIScrollView
的尺寸,然后我将其隐藏。
为了在某些时候根据我想要的用户界面完成任务,我使用了 "time delay function"(给定 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) {
它说
'Thread 1: Fatal error: Can't form Range with upperBound < lowerBound'
在您的代码中,您应该在执行 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
这就是您遇到崩溃的原因,通过检查我的回答中显示的计数条件,这不会崩溃。
希望对您有所帮助。
看起来你想在动画完成后做点什么。如果是这样,请使用其 completion
参数:
UIView.animate(withDuration: 0.3, animations: {
self.BalanceMenu.scrollview.frame = CGRect(x: x1 - 150, y: y1 + 20, width: 200, height: 20)
}, completion: { _ in
self.BalanceMenu.triangle.isHidden = true
self.BalanceMenu.scrollview.isHidden = true
for button in self.BalanceMenuBtn {
button.imag.removeFromSuperview()
button.button.removeFromSuperview()
}
self.BalanceMenuBtn.removeAll()
})
它避免了 delay
方法引入的计时问题。它还使意图更加明确。
不用说,一旦解决了这个紧迫的问题,属性 BalanceMenu
和 BalanceMenuBtn
应该重命名为以小写字母开头,例如 balanceMenu
和 balanceMenuButtons
,分别。还要注意使用 Buttons
后缀而不是 Btn
,以明确它是一个按钮数组。
我尝试使用动画动画关闭菜单,
当尺寸减小到我想要的值时,我决定在按下按钮时减小 UIScrollView
的尺寸,然后我将其隐藏。
为了在某些时候根据我想要的用户界面完成任务,我使用了 "time delay function"(给定 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) {
它说
'Thread 1: Fatal error: Can't form Range with upperBound < lowerBound'
在您的代码中,您应该在执行 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
这就是您遇到崩溃的原因,通过检查我的回答中显示的计数条件,这不会崩溃。
希望对您有所帮助。
看起来你想在动画完成后做点什么。如果是这样,请使用其 completion
参数:
UIView.animate(withDuration: 0.3, animations: {
self.BalanceMenu.scrollview.frame = CGRect(x: x1 - 150, y: y1 + 20, width: 200, height: 20)
}, completion: { _ in
self.BalanceMenu.triangle.isHidden = true
self.BalanceMenu.scrollview.isHidden = true
for button in self.BalanceMenuBtn {
button.imag.removeFromSuperview()
button.button.removeFromSuperview()
}
self.BalanceMenuBtn.removeAll()
})
它避免了 delay
方法引入的计时问题。它还使意图更加明确。
不用说,一旦解决了这个紧迫的问题,属性 BalanceMenu
和 BalanceMenuBtn
应该重命名为以小写字母开头,例如 balanceMenu
和 balanceMenuButtons
,分别。还要注意使用 Buttons
后缀而不是 Btn
,以明确它是一个按钮数组。