【问题标题】:How can I check a if screen is on the navigation stack?如何检查屏幕是否在导航堆栈上?
【发布时间】:2021-01-19 04:30:33
【问题描述】:

鉴于此...

NavigationLink(destination: Text("Hello")) {
   Text("Press")
}

还有这个……

.sheet(isPresented: $viewModel.showComplete) {
   Text("Hello")
}

如果当前不存在由NavigationLink 打开的视图,如何使工作表仅打开?

【问题讨论】:

  • 在 SwiftUI 值类型视图的上下文中,您的 “如果 NavigationLink 打开的视图当前不存在” 不清楚。您能否提供有关用例的更多详细信息?
  • 我为此苦苦挣扎。 NavigationLink 创建一个视图。 showComplete 为真时是否打开?
  • 您可以使用所谓的惰性/延迟视图的概念来避免这种情况。考虑stackoverflow.com/a/61242931/12299030stackoverflow.com/a/60295011/12299030

标签: swiftui


【解决方案1】:

您可以访问 NavigationLink 的 isActive 参数,并在自定义绑定中使用它来确定是否打开工作表。

这是一个简单的演示:

struct ContentView: View {
    @State var showSheet = false
    @State var linkActive = false
    
    var binding: Binding<Bool> {
        .init(get: {
            showSheet && !linkActive
        }, set: {
            showSheet = $0
        })
    }

    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(
                    destination: DetailView(showSheet: $showSheet),
                    isActive: $linkActive
                ) {
                    Text("Go to...")
                }
                Button("Open sheet") {
                    self.showSheet.toggle()
                }
            }
        }
        .sheet(isPresented: binding) {
            Text("Hello")
        }
    }
}

struct DetailView: View {
    @Binding var showSheet: Bool

    var body: some View {
        Button("Open sheet") {
            self.showSheet.toggle()
        }
    }
}

【讨论】:

  • 您的代码有效,但我的代码没有更新 $linkActive。总是假的。
  • 似乎只有当我在bindingget 中有print(linkActive) 时才有效。
  • 另外,如果有多个 NavigationLink,这将不起作用。例如在 ForEach 中。绑定会触发所有链接。
  • @IanWarburton 然后你可以看看NavigationLink(destination:tag:selection:) 并使用selection 而不是isActive
猜你喜欢
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 2020-07-27
  • 1970-01-01
  • 2022-01-20
  • 2022-01-22
  • 2021-03-30
  • 2020-07-22
相关资源
最近更新 更多