【问题标题】:NavigationLink Works Only for OnceNavigationLink 只能使用一次
【发布时间】:2020-04-04 08:16:45
【问题描述】:

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

【问题讨论】:

  • xCode 11.2 (11B52) 版本,此代码在画布和设备上均按预期工作
  • 使用 Xcode 11.2 / iOS 13.2 测试了您的代码快照 - 运行良好。尝试降级 Xcode。
  • Xcode 版本 11.2.1 (11B500) 您的代码可以正常工作。
  • 我给苹果发了一条评论,等待后续更新
  • 已发送错误报告 FB7518930

标签: ios xcode navigation swiftui navigationlink


【解决方案1】:

[更新] 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 的错误。

【讨论】:

  • 对我来说完全一样。我开始后悔为新应用选择了 Swiftui
  • 我只花了 4 个小时感觉非常愚蠢...这东西还没有准备好生产...
  • SwiftUI 基本上仍然是 1.0 版你有没有打算在生产版本中使用 v 1.0?你从它开始,期望它会改进。如果您需要在此之前释放,这将无济于事。
  • @DavidReich 如果 SwiftUI 处于测试阶段,我可以理解会有很多问题。在生产就绪的工具中,至少可以期望它可以工作。自去年首次发布以来,iOS 和 macOS 已经有几次“点更新”,所以像这样的明显错误或“跳表标题错误”应该早就被压制了。我尝试将它用于生产应用程序,但不得不回到 UIKit 以获得不错的结果。
  • [更新] 2020 年 2 月 12 日 - 我在 Xcode 11.4 beta 中检查了这个问题,发现这个问题已经解决了。
【解决方案2】:

模拟器 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(执行:{ self.isActive = false })
  • @SJoshi 我知道了,但 onDisappear 将在 isActive 为 false 之后被调用,因此 NavigationView 将无法正常工作。它只是模拟器的临时解决方案,因为 NavigationView 在设备上正常工作。在以前版本的模拟器中 NavigationView 工作我希望它会在未来的模拟器中得到修复。
  • 奇怪的是,这段代码在我的模拟器或物理设备上不起作用——我提出的解决方案在详细视图被关闭时重置活动标志,并允许物理设备工作。街上的消息是 Xcode 13.4 修复了这个问题
  • 我在模拟器 11.3.1 上进行了测试,它就像一个魅力。你看 3 次开始,我想其他人也有帮助。
  • 是的,我也对此进行了测试——使用多部 iPhone。此外,在 4 个物理设备上进行了测试 - 没有运气。这个错误绝对是一个可笑的错误。在此期间,我最终为模拟器做了一些荒谬的解决方法。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      对于那些在其他版本的 iOS 上出现与其他答案所识别的错误测试版相同症状的任何人,您可能会看到这种行为还有另一个原因。

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

      【讨论】:

        猜你喜欢
        • 2015-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多