如何在macOS的TextField中禁用自动填充及自动格式修正?
如何在macOS的TextField中禁用自动填充及自动格式修正?
我懂你这种头疼的感觉——明明加了disableAutocorrection(true),结果macOS还是自作主张给输入框加句号,各种自动补全也没完全关掉。别担心,这是因为只禁用拼写校正还不够,系统还有一堆智能文本处理的开关要关。下面给你几个靠谱的解决办法:
方法一:先设置文本类型为无,切断系统自动关联
macOS的很多自动行为是基于输入框的文本类型(比如邮箱、手机号)触发的,先把这个关联切断:
Text("ID:") TextField("", text: bindingCurrentID) .disableAutocorrection(true) .textContentType(.none)
这个.textContentType(.none)会告诉系统:这个输入框不需要任何预设的文本类型逻辑,自然就不会触发对应的自动填充或格式修正了。
方法二:关闭所有智能文本修正开关
如果方法一还没解决自动加句号的问题,那是因为还有智能格式化的开关没关,把这些都加上:
Text("ID:") TextField("", text: bindingCurrentID) .disableAutocorrection(true) .textContentType(.none) .autocapitalization(.none) .smartDashesType(.no) .smartQuotesType(.no) .smartInsertDeleteType(.no)
这里的几个属性分别负责:
.autocapitalization(.none):禁用自动大写.smartDashesType(.no):禁用智能破折号替换.smartQuotesType(.no):禁用智能引号替换.smartInsertDeleteType(.no):就是管自动加句号这类智能插入/删除行为的,把它设为.no就能彻底解决空格后自动加句号的问题。
方法三:直接用AppKit原生控件兜底
如果上面的SwiftUI封装还是没搞定,那可以直接包装AppKit的NSTextField,彻底掌控所有属性:
// 先定义一个自定义的原生文本框包装器 struct PlainTextField: NSViewRepresentable { @Binding var text: String func makeNSView(context: Context) -> NSTextField { let textField = NSTextField(string: text) textField.isBordered = true // 保持和SwiftUI TextField类似的样式 // 禁用自动补全 textField.automaticTextCompletionEnabled = false // 移除所有格式化器,避免系统自动处理文本 textField.formatter = nil // 关闭所有智能修正 textField.disableAutocorrection(true) textField.textContentType = .none return textField } func updateNSView(_ nsView: NSTextField, context: Context) { // 同步绑定的文本值 if nsView.stringValue != text { nsView.stringValue = text } } } // 使用的时候这样写 Text("ID:") PlainTextField(text: bindingCurrentID)
这种方法直接操作底层的原生控件,能覆盖所有SwiftUI没暴露的设置,确保输入框完全只接受用户手动输入的内容,没有任何系统自动干预。
一般来说,先试方法一和方法二就能解决问题了,实在不行再用方法三兜底,应该能彻底搞定你遇到的自动加句号和自动填充的问题。
备注:内容来源于stack exchange,提问作者c00000fd
相关产品推荐
相关产品推荐

