如何通过VoiceOver触发SwiftUI List的onDelete操作?
SwiftUI List编辑模式下onDelete的VoiceOver无障碍支持
默认SwiftUI List编辑模式中的红色删除圆圈无法被VoiceOver识别,想要解决这个问题,最直接可靠的方式是自定义删除控件并添加无障碍属性,具体实现如下:
实现思路
- 根据编辑模式状态,在列表行内显示自定义删除按钮,替代默认的不可访问删除附件
- 给按钮添加无障碍标签与动作绑定,确保VoiceOver能识别并触发删除操作
- 保留原有的
onDelete修饰符,兼容普通用户的滑动删除习惯
完整代码示例
struct AccessibleDeleteListView: View { @State private var listItems = ["项目1", "项目2", "项目3", "项目4"] @Environment(\.editMode) private var editMode var body: some View { NavigationStack { List { ForEach(listItems, id: \.self) { item in HStack { Text(item) // 编辑模式下展示自定义删除按钮 if editMode?.wrappedValue == .active { Button(action: { guard let index = listItems.firstIndex(of: item) else { return } listItems.remove(at: index) }) { Image(systemName: "minus.circle.fill") .foregroundColor(.red) } // 无障碍标签:告知VoiceOver用户按钮功能 .accessibilityLabel("删除\(item)") // 无障碍动作:绑定删除逻辑,支持VoiceOver触发 .accessibilityAction(named: "删除") { guard let index = listItems.firstIndex(of: item) else { return } listItems.remove(at: index) } } } } // 保留滑动删除功能 .onDelete(perform: deleteItems) } .navigationTitle("无障碍列表") .toolbar { EditButton() } } } private func deleteItems(at offsets: IndexSet) { listItems.remove(atOffsets: offsets) } }
关键说明
- 自定义按钮会被VoiceOver正常识别,滑动无障碍元素时不会被跳过
accessibilityLabel提供清晰的语音提示,让用户明确按钮作用- 同时保留两种删除方式,兼顾不同用户群体的操作习惯
内容的提问来源于stack exchange,提问作者Kuba
相关产品推荐
相关产品推荐

