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

SwiftUI ForEach.onDelete doesn't work correctly in 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, 2, 3, 4, 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,可以在 .tabItem.

上使用 .tag() 修饰符
        TabStuff()
            // REMOVE THIS
            //.onTapGesture {
            //    selectedTab = .list
            //}
            .tabItem {
                Text("List Test")
                    .tag(NavigationTab.list) // ADD THIS
            }