Swift横向列表添加onDelete属性后删除功能失效求助
SwiftUI横向列表删除功能失效解决方法
你的代码问题出在结构嵌套上:onDelete修饰的ForEach被放在了ScrollView和HStack内部,而SwiftUI的系统删除交互(配合EditButton的那种)需要ForEach直接处于List或Section的直接子层级,这种嵌套结构会让编辑事件无法正确传递,导致删除功能失效。
下面给两种解决思路:
方案一:用系统List的编辑模式(推荐)
去掉多余的ScrollView和HStack,让ForEach直接属于List的Section,同时设置List的高度来适配横向展示的需求:
var body: some View{ NavigationView { List { Section(header: Text("Fruits")) { ForEach(fruits, id: \.self) { fruit in Text(fruit.capitalized) } .onDelete(perform: delete) } } .listStyle(.plain) .navigationTitle("Ejemplo") .navigationBarItems(leading: EditButton()) .frame(height: 80) // 限制列表高度,适配横向展示 } } func delete(indexSet: IndexSet){ fruits.remove(atOffsets: indexSet) }
这样点击EditButton后,每个水果项会出现删除按钮,功能就能正常工作了。
方案二:手动实现删除交互(保留ScrollView横向滚动)
如果一定要保留ScrollView的横向滚动结构,可以自己添加编辑按钮和删除控件,不依赖系统的onDelete:
@State private var isEditing = false var body: some View{ NavigationView { ScrollView(.horizontal, showsIndicators: false) { HStack(spacing: 16) { ForEach(fruits, id: \.self) { fruit in HStack { Text(fruit.capitalized) if isEditing { Button(action: { if let index = fruits.firstIndex(of: fruit) { fruits.remove(at: index) } }) { Image(systemName: "trash") .foregroundColor(.red) } } } .padding() .background(Color.gray.opacity(0.2)) .cornerRadius(8) } } .padding() } .navigationTitle("Ejemplo") .navigationBarItems(leading: Button(isEditing ? "Done" : "Edit") { isEditing.toggle() }) } }
点击导航栏的Edit按钮后,每个横向项会显示删除按钮,点击即可删除对应水果。
内容的提问来源于stack exchange,提问作者Roberto Adrián Cano Rodríguez
相关产品推荐
相关产品推荐

