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

egmofgnx  于 2023-01-29  发布在  Swift
关注(0)|答案(3)|浏览(165)

我无法阻止SwiftUINavigationLink被激活,当在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")
    }
}

在这种情况下,我如何防止导航链接打开详细信息页面?这是SDK中的一个bug吗?
p.s. XCode版本:13.3.1和iOS版本(真实设备):13.3.1

  • 编辑 *

我无法将List替换为ScrollView,因为我的真实应用中有ForEach的项目列表,因此请不要发布考虑使用ScrollView的答案。

dhxwm5r4

dhxwm5r41#

在现实世界的应用程序中,按钮的操作内部可能会发生一些业务逻辑
似乎有点逻辑。你可以简单地有条件地禁用链接(并通知用户,链接是不可用的视觉外观)

NavigationLink(...).disabled(onCondition)

其中

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

参数
失能
一个布尔值,它确定用户是否可以与此视图交互。
返回值
控制用户是否可以与此视图交互的视图。
讨论
视图层次结构中较高的视图可以覆盖您在此视图上设置的值。在以下示例中,按钮不是交互式的,因为外部disabled(_:)修饰符覆盖了内部修饰符:

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

but5z9lq2#

如果我正确地理解了您的目标,它可以是如下所示

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")
        }
    }
}
kh212irz

kh212irz3#

如果您使用.disable(true),它将像禁用按钮一样降低列表项的不透明度,以防止出现这种情况。请使用以下代码样式。使用backGround中的导航链接,并在点击视图的手势上检查导航条件。

VStack{
        List(0..<yourListArray.count, id: \.self) { index in  

        {
            Text("\(yourListArr[index].firstName)")
        }().onTapGesture{
            let jobType = getFlags(jobsArr: yourListArray, index:index) 
           if jobType.isCancelledFlag == true{
               self.shouldNavigate = false
           }else{
               self.shouldNavigate = true
           }
        }//Tap Gesture End
        .background(NavigationLink(destination: YourDestinationView(),isActive: self.$shouldNavigate) {
         }.hidden())}}//vStack

相关问题