SwiftUI ForEach.onDelete 在 TabView 中无法正常工作

问题描述

我尝试用 ForEach 循环实现一个基本列表。我已经尝试过使用 ForEach(...,id: \.self) 的可散列结构和基本数组,如下所示。每当它在选项卡视图中并更改为 EditMode.active 时,您必须按 - 大约一秒钟,就好像它是 LongPressGesture() 一样,直到它显示删除的滑动。

问题示例

struct HashArray: Hashable {
    let id = UUID()
    init(number: Int) {
        self.number = number
    }
    let number: Int
}

struct TabStuff: View {
    @State var markers: [Int] = [1,2,3,4,5]
    @State var testArray: [HashArray] = [HashArray(number: 0),HashArray(number: 1),HashArray(number: 2),HashArray(number: 3)]
    var body: some View {
        vstack {
            EditButton()
            List {
                ForEach(testArray,id: \.id) { marker in
                    Text("Number: \(marker.number)")
                }.onDelete(perform: { indexSet in
                    markers.remove(atOffsets: indexSet)
                })
            }
        }
    }
}

struct OtherView: View {
    @State var markers: [Int] = [1,5]
    var body: some View {
        vstack {
            EditButton()
            List {
                ForEach(markers,id: \.self) { marker in
                   Text("\(marker)")
                }.onDelete(perform: { indexSet in
                    markers.remove(atOffsets: indexSet)
                })
            }
        }
    }
}

当像这样放在标签视图中时,这两者都不起作用

struct ContentView: View {
    @State var selectedTab: NavigationTab = .list

    var body: some View {
        TabView(selection: $selectedTab) {
            TabStuff()
                .onTapGesture {
                    selectedTab = .list
                }
                .tabItem {
                    Text("List Test")
                }

            OtherView()
                .onTapGesture {
                    selectedTab = .secondView
                }.tabItem {
                    Text("Second View")
                }

        }
    }
}

关于如何让它做出适当反应的任何想法?

解决方法

这是因为您在整个视图上有一个 .onTapGesture(),当用户点击您视图中的任何位置时,该视图优先。

选项卡项目将自动让您在选项卡之间切换,而无需更新选择,因此您只需完全删除点击手势即可。但是,如果您需要在切换时更新 selectedTab,您可以在 .tag() 上使用 .tabItem 修饰符。

        TabStuff()
            // REMOVE THIS
            //.onTapGesture {
            //    selectedTab = .list
            //}
            .tabItem {
                Text("List Test")
                    .tag(NavigationTab.list) // ADD THIS
            }