如何解决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
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。