SwiftUI中点击TextField时如何禁止屏幕键盘自动弹出?
SwiftUI TextField禁止屏幕键盘弹出实现方案
你可以根据项目支持的系统版本选择对应的实现方式:
方案1:全系统版本兼容方案
通过封装底层UITextField,设置空inputView从根源阻止键盘弹出,支持iOS13及以上版本。
步骤1:定义无键盘TextField组件
import SwiftUI struct NoKeyboardTextField: UIViewRepresentable { let placeholder: String @Binding var text: String let font: UIFont? func makeUIView(context: Context) -> UITextField { let textField = UITextField() textField.placeholder = placeholder textField.text = text textField.font = font // 核心配置:设置空输入视图,不会触发键盘弹出 textField.inputView = UIView() // 可选配置:如果不需要显示光标,取消下一行注释 // textField.tintColor = .clear textField.addTarget(context.coordinator, action: #selector(Coordinator.updateText), for: .editingChanged) return textField } func updateUIView(_ uiView: UITextField, context: Context) { uiView.text = text uiView.font = font } func makeCoordinator() -> Coordinator { Coordinator(text: $text) } class Coordinator: NSObject { @Binding var text: String init(text: Binding<String>) { self._text = text } @objc func updateText(_ sender: UITextField) { text = sender.text ?? "" } } }
步骤2:替换原有代码
NoKeyboardTextField( placeholder: "Input Amount", text: $inputAmount, font: .systemFont(ofSize: 34, weight: .regular) // 对应SwiftUI的.largeTitle字号 )
方案2:iOS16+极简方案
如果项目最低支持iOS16,直接使用系统原生修饰符即可,无需自定义组件:
TextField("Input Amount", text: $inputAmount) .font(.largeTitle) .textFieldInputView(EmptyView()) // 可选:不需要光标可加下面一行 // .tint(.clear)
注意事项
- 两种方案都保留了TextField的选中、复制粘贴、文本绑定能力,适合需要通过自定义按键、扫码等外部方式输入内容的场景
- 如果需要完全禁止TextField的编辑能力,可以额外加上
.disabled(true)修饰符
内容的提问来源于stack exchange,提问作者Fahim Rahman
相关产品推荐
相关产品推荐

