102

我正在开发一个登录应用程序,登录后列出了类别。在每个类别下,都有一些横向列出的项目。事情是登录后,出现主页,一切都很好。当您单击某个项目时,它会进入详细屏幕,但是当您尝试返回时,它就会崩溃。我发现了这个流程为什么我的 SwiftUI 应用程序在 `NavigationView` 中的 `navigationBarItems` 内放置 `NavigationLink` 后向后导航时会崩溃?但我无法解决我的问题。由于我的项目变得复杂,我只是想在 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 的新手,除了导航之外,一切都很棒。我在互联网上尝试了许多示例和建议的解决方案,但似乎没有任何东西可以解决我的问题。

4

5 回答 5

64

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


[更新] 2020 年 6 月 14 日 - Quang Hà说这个问题在 Xcode 11.5 中又回来了。


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


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

于 2019-12-27T06:38:22.677 回答
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") }))
    }
}
于 2020-01-27T14:52:18.923 回答
3

据推测,当 Apple 修复阻止 13.3 被选择为部署目标的相关错误时,这将得到解决。

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

于 2020-01-31T02:35:20.613 回答
1

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

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

于 2021-07-15T04:37:35.590 回答
1

正如@Александр Грабовский 所说,它似乎是 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)
            }
        }
    }
}
于 2019-12-11T12:51:23.993 回答