SwiftUI中点击背景/列表隐藏键盘与列表项删除按钮冲突问题
问题描述
希望通过View扩展方法hideKeyboard()实现以下功能:
- 点击背景区域时隐藏键盘
- 点击列表区域时隐藏键盘
目前功能基本正常,但存在问题:左滑列表项调出红色delete按钮后,无法点击按钮删除,只能通过完全滑动来删除。尝试使用.simultaneousGesture时:
- 设置
including: .subview:点击列表无法触发隐藏键盘 - 设置
including: .all:无法点击delete按钮删除项
需要同时实现隐藏键盘和点击删除按钮的功能。
解决方案
核心问题是全局给ListView添加手势会和系统的删除按钮手势冲突,因此换个思路,在列表项的内容上单独添加点击手势,既不影响滑动删除交互,又能实现点击列表时隐藏键盘。
修改步骤:
- 移除ContentView中ListView上的
simultaneousGesture代码 - 在ListView的每个列表项文本上添加
onTapGesture来调用hideKeyboard()
修改后的完整代码:
import Foundation import SwiftUI extension View { func hideKeyboard() { UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) } } struct ContentView: View { @State var text = "" var body: some View { NavigationStack { ZStack { // 点击背景隐藏键盘 Color.yellow.ignoresSafeArea().onTapGesture { hideKeyboard() } VStack { TextEditor(text: $text) .border(.red) .frame(height: 100) // 移除原来的simultaneousGesture,改在ListView内部处理点击 ListView() } } } } } struct ListView: View { @State var data = ["item-1", "item-2", "item-3"] var body: some View { List { ForEach(data, id: \.self) { txt in Text(txt) // 点击列表项时隐藏键盘,不影响滑动删除和删除按钮点击 .onTapGesture { hideKeyboard() } } .onDelete { index in if let firstIndex = index.first { data.remove(at: firstIndex) } } }.frame(height: 200) } }
原理说明
- 给单个列表项的文本添加点击手势,只会响应列表项内容的点击,不会干扰列表的滑动删除手势和删除按钮的点击手势
- 背景区域的点击手势依然正常生效,覆盖列表之外的区域
内容的提问来源于stack exchange,提问作者sumida
相关产品推荐
相关产品推荐

