NavigationLink只工作一次


75

我正在使用登录名处理应用程序,登录后列出了类别。在每个类别下,都有一些水平列出的项目。事情是登录后,出现主页,所有内容都列出了。当您单击某个项目时,它会进入详细屏幕,但是当您尝试返回时,它就会崩溃。我发现了这种流程,为什么在将`NavigationLink`放入`NavigationView`的`navigationBarItems`中后向后浏览时,我的SwiftUI应用程序为什么崩溃?但我无法解决我的问题。由于我的项目变得复杂,我只想在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的新手,除了导航之外,其他所有方面都很出色。我在互联网上尝试了许多示例并提出了解决方案,但似乎没有什么可以解决我的问题。


2
xcode的11.2的版本(11B52),此代码的画布和设备两者上按预期
АлександрГрабовский

3
使用Xcode 11.2 / iOS 13.2测试了您的代码快照-效果很好。尝试降级Xcode。
阿斯佩里

1
Xcode版本11.2.1(11B500)您的代码可以正常工作。
Nalov

2
我发了审查,以苹果,它仍然要等待未来的更新
АлександрГрабовский

1
已发送错误报告FB7518930
Pacu

Answers:


56

[UPDATE] 2020年2月12日,我在Xcode 11.4 beta中检查了此问题,发现此问题已解决。


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


10
对我来说完全一样 我开始后悔为新应用选择了Swiftui
theMouk

6
我刚刚呆了4个小时才感到非常愚蠢...这些东西还没准备好生产...
塞巴斯蒂安

SwiftUI基本上仍然是1.0版。您是否打算在生产版本中使用v 1.0?您首先期望会有所改善。如果您需要在此之前释放,这将无济于事。
David Reich

@DavidReich如果SwiftUI处于beta版,我可以理解会有很多问题。在准备生产的工具中,至少可以期望的是它可以工作。自去年首次发布以来,iOS和macOS进行了多次“点更新”,因此像这样的明显错误或“跳转列表标题错误”应该早就被解决了。我尝试将其用于生产应用程序,但不得不返回UIKit以获得不错的结果。
GJ Nilsen

3
[UPDATE] 2020年2月12日,我在Xcode 11.4 beta中检查了此问题,发现此问题已解决。
Sagun Raj Lage

5

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

在使NavigationLink多次运行时,模拟器和物理设备均存在问题。没有任何东西可以在模拟器中修复它,但是与适用于我的物理设备的方法类似的方法是在View2上设置onDisappear,以重置活动标志。对于Xcode错误,这是一种稍微更清洁的解决方法(因为您不必绑定到View2不应该知道的状态)。NavigationViewDemo_View2()。onDisappear(perform:{self.isActive = false})
SJoshi

@SJoshi我知道了,但之后onDisappear 将被调用isActive为false,因此NavigationView将无法正常工作。这是模拟器的临时解决方案,仅因为NavigationView在设备上可以正常工作。我希望在早期版本的模拟器中,NavigationView可以正常工作,希望以后的模拟器中可以修复它。
维克多·库什内罗夫

奇怪的是,此代码在我的模拟器或物理设备上不起作用-我建议的解决方案是在关闭详细视图时重置活动标志,并允许物理设备工作。在大街上有消息说Xcode 13.4解决了此问题
SJoshi

我在模拟器11.3.1上进行了测试,它的工作原理很吸引人。您看到3个开始,我想其他人也帮了忙。
维克多·库什内罗夫

是的,我也进行了测试-使用多部iPhone。另外,在4种物理设备上进行了测试-没运气。此错误绝对是一个荒谬的错误。在此期间,我最终为模拟器做了一些荒谬的解决方法。
SJoshi


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)
            }
        }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.