我创建了一个可以重现我的问题的简单展示;我正在做的是从初始视图 => View1 => View2 导航。
从初始到 View1 的导航是通过按钮点击发生的,这里没有什么特别的。
我的 View1 如下所示:
struct View1: View {
@ObservedObject private var viewModel = ViewModel()
private let includeDelay = true
var body: some View {
NavigationLink(
destination: View2(),
isActive: $viewModel.foo,
label: {
Text("View 1")
})
.onAppear(perform: {
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(includeDelay ? 500 : 0)) {
viewModel.doSomething()
}
})
}
}
class ViewModel: ObservableObject {
@Published var foo = false
func doSomething() {
foo = true
}
}
如果我将延迟包含在 中onAppear
,它会按预期工作;延迟之后,我被导航到View2
并留在那里。
但是,如果我删除延迟(或将其设置为例如 300 毫秒),我会被导航到View2
,但会立即被导航回来。我不明白这里发生了什么;为什么我$viewModel.foo
设置为 false 后设置为true
?