繁体   English   中英

SwiftUI NavigationLink isActive 绑定未更新/工作

[英]SwiftUI NavigationLink isActive Binding Not Updated/Working

我有以下内容:

@State private var showNext = false

...
    NavigationStack {
        VStack {
            NavigationLink(destination: NextView(showSelf: $showNext),
                           isActive: $showNext) { EmptyView() }

            Button("Show Next") {
                showNext = true
            }
        }
    }

...

struct NextView: View {
    @Binding var showSelf: Bool

    var body: some View {
        Text("Next")
         .navigationTitle("Next")

        Button("Dismiss") {
            showSelf = false
        }
            .padding(30)
    }
}

点击Show Next时, NextView会按预期显示。

但是当点击Dismiss时,没有任何反应。

原来showSelf在设置为false之前就已经是false了。 因此,将绑定传递给NextView似乎出了点问题。

有什么问题吗?

该问题是由NavigationStack引起的。 当我用NavigationView替换它时,它按预期工作。

当嵌入NavigationStack时, NavigationLinkisActive绑定似乎不起作用(或不受支持)。

当您没有正确地为 NavigationView 提供详细视图时,有时会发生这种错误,例如

NavigationView {
    MainView()
    DetailView()
}

它试图在层次结构的更下方使用另一个视图,这可能导致 isActive 之类的东西中断。 在您的情况下, NextView中可能存在一个错误,您有 2 个视图但没有容器,请尝试将其更改为:

struct NextView: View {
    @Binding var showSelf: Bool

    var body: some View {
        HStack {
            Text("Next")
            Button("Dismiss") {
                showSelf = false
            }
        }
        .navigationTitle("Next")
    }
}

另一件非标准的事情是EmptyView的使用。

您正在尝试混合 iOS >= 16 ( NavigationStack ) 和 iOS < 16 的代码(以前处理NavigationLink的方法)。 同样对于 dismiss 部分,它是 iOS < 15。

这是 iOS 16 的代码:

import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationStack {
            VStack {
                NavigationLink {
                    NextView()
                } label: {
                    Text("Show next view")
                }
            }
        }
    }
}

struct NextView: View {
    @Environment(\.dismiss) private var dismiss
    var body: some View {
        VStack {
            Text("You are in the next view")
            Button("Dismiss", action: dismiss.callAsFunction)
        }
        .navigationTitle("Next")
    }
}

我使用了最简单的NavigationLink结构。 一个更复杂的将与.navigationDestination结合使用。 我发现的最好的例子在这里:

如果您想更深入地了解堆栈的非常奇怪的行为,您可以在这里查看我的帖子: 在与新的导航堆栈组合时发现@State 的奇怪行为 - 这是一个错误还是我做错了?

如果您需要为 iOS < 16 生成代码,则应将NavigationStack替换为NavigationView并从那里开始工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM