NavigationLink 只工作一次

NavigationLink Works Only for Once

我正在开发一个需要登录的应用程序,登录后会列出类别。在每个类别下,都有一些横向列出的项目。事情是在登录后,主页出现,一切都很好。当您单击某个项目时,它会进入详细屏幕,但当您尝试返回时,它就会崩溃。我发现了这个流程 但我无法解决我的问题。由于我的项目变得复杂,我只是想在swiftui中练习导航并创建了一个新项目。顺便我下载了最新的xcode版本11.3。我写了一个简单的代码如下:

NavigationView{
        NavigationLink(destination: Test()) {
            Text("Show Detail View")
        }
    .navigationBarTitle("title1")

而Test()视图如下:

import SwiftUI

struct Test: View {
    var body: some View {
        Text("Hello, World!")
    }
}

struct Test_Previews: PreviewProvider {
    static var previews: some View {
        Test()
    }
}

如您所见,它非常简单。我也在互联网上尝试过类似的例子,但它并没有按照预期的方式工作。当我 运行 项目时,我单击导航 link 并导航到 Test() 视图。然后我点击后退按钮,它导航到主页。但是,当我第二次单击导航 link 时,没有任何反应。导航 link 只工作一次,之后什么也没有发生。它不导航,它不会抛出任何错误。我是 swiftui 的新手,除了导航之外一切都很棒。我在互联网上尝试了很多示例和建议的解决方案,但似乎无法解决我的问题。

正如@Александр Γрабовский 所说,它似乎是一个 Xcode 11.3 错误,我遇到了同样的问题,您必须降级或使用一些解决方法,例如下面的自定义后退按钮

struct ContentView: View {
    @State private var pushed: Bool = false

    var body: some View {

        NavigationView {
            VStack {
                Button("Show Detail View") {
                    self.pushed.toggle()
                }

                NavigationLink(destination: Test(pushed: $pushed), isActive: $pushed) { EmptyView() }
            }.navigationBarTitle("title1")
        }
    }
}
struct Test: View {
    @Binding var pushed: Bool
    var body: some View {
        Text("Hello, World!")
            .navigationBarBackButtonHidden(true)
            .navigationBarItems(leading: BackButton(label: "Back") {
                self.pushed = false
            })
    }
}
struct BackButton: View {
    let label: String
    let closure: () -> ()

    var body: some View {
        Button(action: { self.closure() }) {
            HStack {
                Image(systemName: "chevron.left")
                Text(label)
            }
        }
    }
}

[更新] 2020 年 11 月 5 日 - pawello2222 表示此问题已在 Xcode 12.1.

中修复

[更新] 2020 年 6 月 14 日 - Quang Hà 表示此问题已在 Xcode 11.5 中再次出现。


[更新] 2020 年 2 月 12 日 - 我在 Xcode 11.4 beta 中检查了这个问题,发现这个问题已经解决。


当我在 Xcode 的模拟器中测试它时,我在我的项目中也遇到了同样的问题。但是,当我在真实设备(iPhone X 和 iOS 13.3)上启动该应用程序时,NavigationLink 运行良好。所以,它确实看起来像 Xcode 的错误。

模拟器 11.4:此问题已修复

您需要在第二个视图中重置默认 isActive 值。 它适用于设备和模拟器。

struct NavigationViewDemo: View {
    @State var isActive = false

    var body: some View {
        NavigationView {
            VStack {
                Text("View1")
                NavigationLink(
                    destination: NavigationViewDemo_View2(isActive: $isActive),
                    isActive: $isActive,
                    label: { Button(action: { self.isActive = true }, label: { Text("click") }) })
            }
        }
    }
}

struct NavigationViewDemo_View2: View {
    @Binding var isActive: Bool

    var body: some View {
        Text("View2")
            .navigationBarItems(leading: Button(action: { self.isActive = false }, label: { Text("Back") }))
    }
}

据推测,这将在 Apple 修复 the related bug that prevents 13.3 from being selectable as a deployment target 时解决。

我遇到了和其他人一样的问题。此问题存在于模拟器和预览版 运行 13.2 中,但在部署到我自己的设备时已修复 运行 13.3.

对于与其他版本的 iOS 有相同症状而不是其他答案确定的错误测试版的任何人,您可能会看到此行为的另一个原因。

如果您的 NavigationLink 嵌套在另一个 NavigationLink 中,则内部 NavigationLink 将只能工作一次,除非您将 isDetailLink(false) 添加到外部 link .