我有这个circles
数组,导致在随机位置创建圆,然后淡出。在淡出一个圆后,我需要完全删除它,这是通过在等于淡出动画结束的延迟后删除数组中的相应行来实现的。
只要我单击“添加圆圈”按钮的频率低于删除速度,它就可以正常工作。但是,当我继续快速按下它时,视图会因崩溃index out of range
。这似乎是算法感到困惑的结果:它通过索引标识要删除的行,但与此同时,其他行也可能已删除/添加,这意味着索引已经不同。
请参阅:
import SwiftUI
let screenW = UIScreen.main.bounds.size.width
let screenH = UIScreen.main.bounds.size.height
struct PlayGround: View {
struct BlackCircle {
var id = UUID()
var position: CGPoint
var opacity: Double = 1
}
@State var circles: [BlackCircle] = []
var body: some View {
ZStack {
ForEach(Array(circles.enumerated()), id: \.1.id) {
index, item in
Circle()
.frame(width:30, height:30)
.position(item.position)
.opacity(item.opacity)
.onAppear {
let animation = Animation.linear(duration: 1)
withAnimation(animation) {
circles[index].opacity = 0
}
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
circles.remove(at: index)
}
}
}.frame(width: screenW, height:screenH)
Button(action: {
let randx = CGFloat.random(in: 30...screenW-30)
let randy = CGFloat.random(in: 30...screenH-30)
let randpos = CGPoint(x: randx, y: randy)
circles.append(BlackCircle(position: randpos))
}, label: {
Text("Add a Circle")
})
}
}
}
解决此问题的最简单,最省力的方法是在圆消失后才不删除该行。当然,这既是优雅的又是低效的(可能最终导致数组中成千上万的无用行)。那么,当新元素一直被添加并被延迟删除时,我将如何防止数组崩溃呢?
谢谢!
如果问题是由于索引超出范围,请尝试根据ID(而不是索引)删除圆圈:
circles.removeAll { (existingCircle) -> Bool in
return existingCircle.id == item.id
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句