【问题标题】:How do I reset a selection tag when pushing a NavigationLink programmatically?以编程方式推送 NavigationLink 时如何重置选择标签?
【发布时间】:2019-12-13 20:00:33
【问题描述】:

我想以编程方式推送视图,而不是依赖 NavigationLink 提供的界面(例如,我想use a button with no chevron)。 correct way 是使用带有标签和选择的 NavigationLink 以及 EmptyView。

当我尝试使用以下代码推送视图时,它会在第一次推送视图时起作用:

struct PushExample: View {
  @State private var pushedView: Int? = nil

  var body: some View {
    NavigationView {
      VStack {
        Form {
          Button(action: { self.pushedView = 1 }) { Text("Push view") }
        }

        NavigationLink(destination: Text("Detail view"), tag: 1, selection: $pushedView) { EmptyView() }
      }
    }
  }
}

但是,如果我点击视图上的后退按钮,然后再次尝试点击该按钮,它将不再推动视图。 这是因为值pushedView 再次设置为1,但它已经位于1。在弹出Detail view 时,没有什么可以将其重置回nil

如何让后续点击按钮再次推送视图?

【问题讨论】:

标签: ios swiftui


【解决方案1】:

TL;DR: 无需重置状态变量,因为 SwiftUI 会自动为您处理。如果不是,则可能是模拟器的错误。


这是 Xcode 11.3 上的一个模拟器错误!

检查是否是模拟器错误的方法是运行一个更简单的示例:

struct ContentView: View {
  var body: some View {
    NavigationView {
      NavigationLink("Push", destination: Text("Detail"))
    }
  }
}

在 Xcode 11.3 iPhone 11 Pro Max 上,这只会在您第一次点击链接时起作用。

这在 13.2 和 13.3 设备上都运行良好。

因此,当遇到奇怪的 SwiftUI 问题时,请在设备而不是模拟器上进行测试。


更新:重新启动计算机也没有解决问题。因此,虽然 SwiftUI 仍然是新的,但使用真实设备而不是模拟器进行测试可能会更好。

【讨论】:

  • 太棒了!这确实是一个模拟器错误(仍然存在,Xcode 11.3.1)并且在设备上运行良好。我有一个带有多个可选行的List:选择一行会推送一个 UIKit 桥接视图,然后返回并点击同一行没有任何效果 - 在点击后退按钮时不会释放推送的视图。返回并选择表中的另一行确实会推送新行,但会立即弹回(因为那是释放先前推送的视图时)。很高兴它只在模拟器上,已经在尝试各种解决方法。
猜你喜欢
  • 2022-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多