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 中是不是有等效的 popViewController?