雖然我在點擊按鈕時得到了影片,但這不是我想要的影片。整個視圖立即被替換,但我希望看到每個元素按順序更改。我在父視圖和被呼叫方法中都進行了嘗試。兩者都不會產生預期的結果。
(這是原始代碼的簡化版本)
import SwiftUI
struct SequencedCell: Identifiable {
let id = UUID()
var value: Int
mutating func addOne() {
value = 1
}
}
struct AQTwo: View {
@State var cells: [SequencedCell]
init() {
_cells = State(initialValue: (0 ..< 12).map { SequencedCell(value: $0) })
}
var body: some View {
VStack {
Spacer()
Button(" ") {
sequencingMethod(items: $cells)
}
.font(.largeTitle)
Spacer()
HStack {
ForEach(Array(cells.enumerated()), id: \.1.id) { index, item in
// withAnimation(.linear(duration: 4)) {
Text("\(item.value)").tag(index)
// }
}
}
Spacer()
}
}
func sequencingMethod(items: Binding<[SequencedCell]>) {
for cell in items {
withAnimation(.linear(duration: 4)) {
cell.wrappedValue = SequencedCell(value: cell.wrappedValue.value 1)
// cell.wrappedValue.addOne()
}
}
}
}
struct AQTwoPreview: PreviewProvider {
static var previews: some View {
AQTwo()
}
}
所以我希望 0 變成 1,然后 1 變成 2,等等。

編輯: 即使我接受了答案,它也回答了我的問題,但沒有解決我的問題。
我不能使用DispatchQueue.main.asyncAfter,因為我正在更新的值是一個 inout 引數,它使編譯器不高興:
Escaping closure captures 'inout' parameter 'grid'
所以我嘗試了 Malcolm 的(malhal)建議使用延遲,但一切都立即發生,沒有順序影片(整個更新專案塊影片為一個)
這是我正在呼叫的遞回方法:
static func recursiveAlgorithm(targetFill fillValue: Int, in grid: inout [[CellItem]],
at point: (x: Int, y: Int), originalFill: Int? = nil, delay: TimeInterval) -> [[CellItem]] {
/// make sure the point is on the board (or return)
guard isValidPlacement(point) else { return grid }
/// the first time this is called we don't have `originalFill`
/// so we read it from the starting point
let tick = delay 0.2
//AnimationTimer.shared.tick()
let startValue = originalFill ?? grid[point.x][point.y].value
if grid[point.x][point.y].value == startValue {
withAnimation(.linear(duration: 0.1).delay(tick)) {
grid[point.x][point.y].value = fillValue
}
_ = recursiveAlgorithm(targetFill: fillValue, in: &grid, at: (point.x, point.y - 1), originalFill: startValue, delay: tick)
_ = recursiveAlgorithm(targetFill: fillValue, in: &grid, at: (point.x, point.y 1), originalFill: startValue, delay: tick)
_ = recursiveAlgorithm(targetFill: fillValue, in: &grid, at: (point.x - 1, point.y), originalFill: startValue, delay: tick)
_ = recursiveAlgorithm(targetFill: fillValue, in: &grid, at: (point.x 1, point.y), originalFill: startValue, delay: tick)
}
return grid
}
歡迎進一步的評論/建議,因為我繼續努力解決這個問題。
uj5u.com熱心網友回復:
正如評論中提到的,最低技術版本可能只是使用DisatpchQueue.main.asyncAfter呼叫:
func sequencingMethod(items: Binding<[SequencedCell]>) {
var wait: TimeInterval = 0.0
for cell in items {
DispatchQueue.main.asyncAfter(deadline: .now() wait) {
withAnimation(.linear(duration: 1)) {
cell.wrappedValue = SequencedCell(value: cell.wrappedValue.value 1)
}
}
wait = 1.0
}
}
uj5u.com熱心網友回復:
您可以為此使用delay(_:),例如
func sequencingMethod(items: Binding<[SequencedCell]>) {
var delayDuration = 0.0
for cell in items {
withAnimation(.linear(duration: 4).delay(delayDuration)) {
cell.wrappedValue = SequencedCell(value: cell.wrappedValue.value 1)
}
delayDuration = 0.5
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/480117.html
