SwiftUI:在列表中时始终激活NavigationLink

时间:2020-02-29 12:53:19

标签: swift xcode swiftui navigationlink

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

List

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

p.s。 XCode版本: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") } } 和iOS版本(真实设备):13.3.1

编辑

我不能用13.3.1替换List,因为我的真实应用程序中有ScrollView个项目列表,因此不要考虑使用ForEach发布答案。

2 个答案:

答案 0 :(得分:1)

如果我正确理解了您的目标,则可能如下所示

List {
    Text("Text 1")
    Text("Text 2")
    Text("Text 3")
    LinkView(showDetails: $showDetail)
        .background(
            NavigationLink(destination: DetailView(), isActive: $showDetail) { EmptyView() })
}

struct LinkView: View {
    @Binding var showDetails: Bool

    var body: some View {
        Button(action: {
            self.showDetails = true // < activate by some logic
        }) {
            Text("Open Details")
        }
    }
}

答案 1 :(得分:1)

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

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

NavigationLink(...).disabled(onCondition)

其中

func disabled(_ disabled: Bool) -> some View

参数

已禁用

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

返回值

用于控制用户是否可以与此视图进行交互的视图。

讨论

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

HStack {
    Button(Text("Press")) {}
    .disabled(false)
}
.disabled(true)