SwiftUI中List添加手势后swipeActions按钮无法点击的问题求助
SwiftUI中List添加手势后swipeActions按钮无法点击的问题求助
我太懂你这种头疼的处境了——为了让List空白区域点击后能收起TextField的焦点,你给List加了手势,结果倒好,滑出来的swipeActions按钮直接点不动了,而且你还发现这大概率是SwiftUI里List点击定位相关的Bug,对吧?
先把你大概的代码补全一下(应该是输入时截断了),方便大家更清楚场景:
struct ContentView: View { var body: some View { List { Text("Hello, World!") .swipeActions { Button("删除") { // 这里是你的按钮执行逻辑 } .tint(.red) } } // 你应该是在这里加了手势来取消TextField焦点 .onTapGesture { UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) } } }
问题根源其实很直白:你给整个List加的onTapGesture会“抢占”所有点击事件,包括swipeActions滑出按钮区域的点击,导致按钮根本接收不到点击信号。
给你两个实用的解决办法:
方法一:把手势加到List的背景层(最推荐)
别直接给List加手势,转而给List的背景添加手势,这样只有点击空白背景时才会触发取消焦点的动作,cell和swipe按钮的手势优先级更高,不会被挡住:struct ContentView: View { var body: some View { List { Text("Hello, World!") .swipeActions { Button("删除") { // 按钮逻辑 } .tint(.red) } } // 给背景加手势,只响应空白区域点击 .background( Color.clear .contentShape(Rectangle()) .onTapGesture { UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) } ) } }方法二:调整手势的响应优先级
如果一定要给List本身加手势,可以用simultaneousGesture让手势和swipeActions的手势同时响应,不过这个方法在部分系统版本里可能存在兼容性问题:List { // 你的List内容 } .simultaneousGesture( TapGesture() .onEnded { UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) } )
另外你提到的List点击定位Bug,在iOS 15到16的部分小版本里确实存在,要是你用的是这些版本,升级到最新稳定版的iOS/Xcode也能帮你缓解一些类似的手势冲突问题。
备注:内容来源于stack exchange,提问作者Space
相关产品推荐
相关产品推荐

