SwiftUI:在列表中时,NavigationLink 始终处于激活状态

JAH*_*lia 3 xcode swift swiftui navigationlink

我无法阻止SwiftUI'sNavigationLink在 a 中被激活List,我有这段简单的代码,在决定是否显示详细信息页面之前,我需要在其中进行某种业务检查(在现实世界的应用程序中,可能会有某些业务逻辑发生在按钮的操作内):

struct ContentView: View {
    @State var showDetail = false
    var body: some View {
        NavigationView {
            List {
                Text("Text 1")
                Text("Text 2")
                Text("Text 3")
                NavigationLink(destination: DetailView(), isActive: $showDetail) {
                    LinkView(showDetails: $showDetail)

                }
            }
        }
    }
}

struct LinkView: View {
    @Binding var showDetails: Bool

    var body: some View {
        Button(action: {
            self.showDetails = false
        }) {
            Text("Open Details")
        }
    }
}

struct DetailView: View {
    var body: some View {
        Text("Detail View")
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如何防止导航链接打开详细信息页面?这是 SDK 中的错误吗?

ps XCode版本:13.3.1和iOS版本(真机):13.3.1

编辑

我无法将 List 替换ScrollView为 因为我的真实应用程序中有一个ForEach项目列表,所以不要发布考虑使用 的答案ScrollView

use*_*734 9

\n

在现实世界的应用程序中,按钮操作中可能会发生一些业务逻辑

\n
\n\n

似乎有点不合逻辑。您可以简单地有条件地禁用该链接(并通过视觉外观通知用户该链接不可用)

\n\n
NavigationLink(...).disabled(onCondition)\n
Run Code Online (Sandbox Code Playgroud)\n\n

在哪里

\n\n
func disabled(_ disabled: Bool) -> some View\n
Run Code Online (Sandbox Code Playgroud)\n\n

参数

\n\n

残疾人

\n\n

一个布尔值,确定用户是否可以与此视图交互。

\n\n

返回值

\n\n

控制用户是否可以与该视图交互的视图。

\n\n

讨论

\n\n

视图层次结构中的较高视图可以覆盖您在此视图上设置的值。在以下示例中,该按钮\xe2\x80\x99t 是交互式的,因为外部的disabled(_:) 修饰符会覆盖内部的修饰符:

\n\n
HStack {\n    Button(Text("Press")) {}\n    .disabled(false)\n}\n.disabled(true)\n
Run Code Online (Sandbox Code Playgroud)\n