NavigationLink只工作一次

时间:2019-12-11 05:05:12

标签: ios xcode navigation swiftui navigationlink

我正在处理具有登录名的应用程序,登录后列出了类别。在每个类别下,都有一些水平列出的项目。事情是登录后,出现主页,所有内容都列出了。当您单击某个项目时,它会转到详细屏幕,但是当您尝试返回时,它就会崩溃。我发现了此流程Why does my SwiftUI app crash when navigating backwards after placing a `NavigationLink` inside of a `navigationBarItems` in a `NavigationView`?,但无法解决问题。由于我的项目变得复杂,我只想在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()
    }
}

您可以看到它非常简单。我还在互联网上尝试过类似的示例,但是它不能像预期的那样工作。运行项目时,单击导航链接,然后导航到Test()视图。然后,单击“后退”按钮,它导航到主页。但是,当我第二次单击导航链接时,没有任何反应。导航链接仅工作一次,此后什么也没有发生。它不会导航,它不会抛出任何错误。我是swiftui的新手,除了导航之外,其他所有方面都很出色。我在互联网上尝试了许多示例并提出了解决方案,但似乎没有什么可以解决我的问题。

5 个答案:

答案 0 :(得分:8)

模拟器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") }))
    }
}

答案 1 :(得分:3)

当我在Xcode的模拟器中进行测试时,我的项目中也遇到了同样的问题。但是,当我在真实设备(带有iOS 13.3的iPhone X)上启动该应用程序时,NavigationLink可以正常工作。因此,它的确确实像Xcode的bug。

答案 2 :(得分:3)

大概这将在Apple修复the related bug that prevents 13.3 from being selectable as a deployment target时解决。

我遇到了与其他所有人相同的问题。在运行13.2的模拟器和预览版中存在此问题,但在将其部署到运行13.3的我自己的设备时已解决。

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

正如@АлександрГрабовский所说,它似乎是一个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)
            }
        }
    }
}