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
}
我尝试用 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
}