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

SwiftUI中点击背景/列表隐藏键盘与列表项删除按钮冲突问题

问题描述

希望通过View扩展方法hideKeyboard()实现以下功能:

  • 点击背景区域时隐藏键盘
  • 点击列表区域时隐藏键盘

目前功能基本正常,但存在问题:左滑列表项调出红色delete按钮后,无法点击按钮删除,只能通过完全滑动来删除。尝试使用.simultaneousGesture时:

  • 设置including: .subview:点击列表无法触发隐藏键盘
  • 设置including: .all:无法点击delete按钮删除项

需要同时实现隐藏键盘和点击删除按钮的功能。

解决方案

核心问题是全局给ListView添加手势会和系统的删除按钮手势冲突,因此换个思路,在列表项的内容上单独添加点击手势,既不影响滑动删除交互,又能实现点击列表时隐藏键盘。

修改步骤:

  1. 移除ContentView中ListView上的simultaneousGesture代码
  2. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:22:13