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

Posted

技术标签:

【中文标题】SwiftUI ForEach.onDelete 在 TabView 中无法正常工作【英文标题】:SwiftUI ForEach.onDelete doesn't work correctly in TabView 【发布时间】:2021-02-05 20:07:07 【问题描述】:

我尝试使用 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")
                

        
    

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于SwiftUI ForEach.onDelete 在 TabView 中无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

swiftui删除核心数据行

SwiftUI - SwiftUI 中是不是有等效的 popViewController?

swiftui 请求 渲染数据

SwiftUI 学习曲线

SwiftUI NavigationLink 如何到达另一个 SwiftUI 页面?

SwiftUI - 如何在 SwiftUI 中弹出到特定视图?