我有一个swiftUI视图,它有许多动画,这些动画被绑定到一个结构数组中。当我在手机上测试这个应用程序时,我就会得到EXC_BAD_ACCESS。这就是backtrace顶部的样子:
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=2, address=0x16f7cfff0)
frame #0: 0x00000001892665c8 SwiftUI`SwiftUI.DefaultCombiningAnimator.value(in: τ_0_0.Value, for: Swift.Double) -> Swift.Optional<τ_0_0.Value> + 48
frame #1: 0x00000001892fac40 SwiftUI`SwiftUI.AnimatorBox.value(in: τ_0_0.Value, for: Swift.Double) -> Swift.Optional<τ_0_0.Value> + 168
frame #2: 0x0000000189264a28 SwiftUI`SwiftUI.AnyAnimator.value(in: τ_0_0, for: Swift.Double) -> Swift.Optional<τ_0_0> + 156
frame #3: 0x0000000189266898 SwiftUI`SwiftUI.DefaultCombiningAnimator.value(in: τ_0_0.Value, for: Swift.Double) -> Swift.Optional<τ_0_0.Value> + 768
frame #4: 0x00000001892fac40 SwiftUI`SwiftUI.AnimatorBox.value(in: τ_0_0.Value, for: Swift.Double) -> Swift.Optional<τ_0_0.Value> + 168
frame #5: 0x0000000189264a28 SwiftUI`SwiftUI.AnyAnimator.value(in: τ_0_0, for: Swift.Double) -> Swift.Optional<τ_0_0> + 156
frame #6: 0x0000000189266898 SwiftUI`SwiftUI.DefaultCombiningAnimator.value(in: τ_0_0.Value, for: Swift.Double) -> Swift.Optional<τ_0_0.Value> + 768
frame #7: 0x00000001892fac40 SwiftUI`SwiftUI.AnimatorBox.value(in: τ_0_0.Value, for: Swift.Double) -> Swift.Optional<τ_0_0.Value> + 168
frame #8: 0x0000000189264a28 SwiftUI`SwiftUI.AnyAnimator.value(in: τ_0_0, for: Swift.Double) -> Swift.Optional<τ_0_0> + 156前面的4000个帧都重复了相同的AnyAnimator / AnimatorBox / DefaultCombiningAnimator序列。我唯一能看到的区别是,在第0帧中,DefaultCombiningAnimator以'-> Swift.Optional<τ__0.Value> + 48‘结尾,而不是'+ 768’。
有人能告诉我(如果有的话)这告诉我什么吗?基础数组不断更新,但保持固定大小,不添加或删除。
这是动画视图元素:
ZStack {
//MARK: - Fret Cents Label
NoteLabel()
.fill(activeFret == thisFret ? .white : intonationModel.gString[thisFret].hasBeenSet ? .black : .gray)
.opacity(0.8)
.shadow(color: .black, radius: 4, x: 0, y: 3)
VStack(spacing: 0) {
Text(String(format: "%.1f", cents))
.font(Font.custom("Karantina-Regular", size: scaleHeight * 0.06))
.foregroundColor(activeFret == thisFret ? .black : .white)
}
}
.frame(width: width * 0.9 , height: scaleHeight * 0.1)
.position(x: width * 0.6, y: scaleHeight * 0.5)
.offset(y: yScaleCents * abs(cents) <= 10 ?
scaleHeight * (yScaleCents * 0.05 * -cents) :
scaleHeight * 0.5 * -(abs(cents) / cents))
.animation(.easeInOut(duration: 0.2), value: cents)这是父视图中调用它的地方:
ForEach($intonationModel.gString.indices, id: \.self) { index in
let columnWidth = fretWidth + (120 / (CGFloat(index + 1) * 4))
if index > 0 {
VStack(spacing: 0) {
IntonatorChartColumn(
thisFret: index,
scaleHeight: scaleHeight,
scaleMargin: scaleMargin,
fretboardHeight: fretboardHeight,
fretLabelHeight: fretLabelHeight,
yScaleCents: self.yScaleCents,
stringGap: stringGap,
showFretboard: $showFretboard,
cents: $intonationModel.gString[index].cents,
note: $intonationModel.gString[index].closestNote,
octave: $intonationModel.gString[index].octave,
activeFret: $intonationModel.currentFret
)
.frame(width: columnWidth)
.id(index)
}
.padding(.top, topMargin)
}
}当我在寻找僵尸的时候,这个应用拒绝崩溃,尽管它在不被监控的时候会可靠的崩溃。我将重新编写代码,以避免索引的使用(如jnpdx所建议的)。
发布于 2022-08-30 08:59:21
我相信这里发生了两件事。
,
的ForEach的错误使用
ForEach(Array(zip(intonationEngine.gString.indices, intonationEngine.gString)) , id: \.0) {index, note in自从这样做之后,崩溃就停止了。
https://stackoverflow.com/questions/71396944
复制相似问题