ios - 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:致命错误:无法形成具有上界 < 下界的范围'
解决方案
在您的代码中,您应该在执行 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
这就是为什么您会发生崩溃,并且通过检查我的回答中显示的计数条件,这不会崩溃。
希望这可以帮助。
推荐阅读
- ruby-on-rails - 从 rails(后端)获取方法的响应到 Vue 模块
- fabricjs - Fabricjs 的对象组未显示且行为不正确
- azure - Azure Functions Core Tools 无法安装绑定所需的扩展,在 Ubuntu 服务器中出现 SSL 错误
- autofac - Autofac 是否支持在 Blazor WebAssembly 延迟加载程序集中注册服务
- javascript - Selenium 问题当在网站上以 DIV 形式提供表格数据时,在 DIV 内我每行都有一个 div
- react-native - SVG 被切入 React Native
- c - 与 Linux 相比,Windows/MSYS2 上的双重初始化错误
- arrays - 将熊猫数据框转换为 json
- sql - BigQuery/Tableau 日期错误:无效日期:“2021 年 2 月 5 日”
- java - 使用 MutableLiveData 时是否必须通知我的 ListAdapter?