簡體   English   中英

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
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM