首页 > 解决方案 > 带有 NavigationView/NavigationLink 延迟的程序化导航跳回

问题描述

我创建了一个可以重现我的问题的简单展示;我正在做的是从初始视图 => 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

标签: swiftuiswiftui-navigationlinkswiftui-navigationview

解决方案


推荐阅读