You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 11:45:32