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

SwiftUI如何获取当前键盘布局(QWERTY/QWERTZ/北欧布局等)

iOS 检测 TextField 对应的键盘布局(QWERTY/AZERTY/QWERTZ等)

核心思路就是利用textField.textInputMode,这个属性能获取当前输入框关联的输入模式信息,从中可以提取键盘布局相关的标识。

实现步骤

  1. 监听输入模式变化
    当用户切换键盘时,系统会发送UITextInputMode.currentInputModeDidChangeNotification通知,我们可以注册这个通知来实时检测布局变化:

    override func viewDidLoad() {
        super.viewDidLoad()
        // 注册键盘输入模式变化通知
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardInputModeChanged), name: UITextInputMode.currentInputModeDidChangeNotification, object: nil)
    }
    
  2. 处理布局检测逻辑
    在通知回调里,通过textInputMode的primaryLanguage(语言代码)和inputModeIdentifier(输入模式标识符)来判断布局:

    @objc private func keyboardInputModeChanged() {
        guard let inputMode = yourTextField.textInputMode else { return }
        
        // 优先通过语言代码判断
        switch inputMode.primaryLanguage {
        case "en-US", "en-GB":
            print("当前是QWERTY布局")
        case "fr-FR", "fr-BE":
            print("当前是AZERTY布局")
        case "de-DE", "de-AT", "de-CH":
            print("当前是QWERTZ布局")
        case "sv-SE", "nb-NO", "da-DK":
            print("当前是北欧布局")
        default:
            // 语言代码不明确时,直接从标识符里匹配布局关键词
            let identifier = inputMode.inputModeIdentifier
            if identifier.contains("AZERTY") {
                print("当前是AZERTY布局")
            } else if identifier.contains("QWERTZ") {
                print("当前是QWERTZ布局")
            } else if identifier.contains("QWERTY") {
                print("当前是QWERTY布局")
            } else {
                print("无法识别的键盘布局")
            }
        }
    }
    
  3. 可选:编辑开始时检测
    如果只需要在用户开始编辑TextField时检测布局,也可以在代理方法里处理:

    func textFieldDidBeginEditing(_ textField: UITextField) {
        guard let inputMode = textField.textInputMode else { return }
        // 这里复用上面的判断逻辑即可
    }
    

注意点

  • primaryLanguage是ISO标准的语言地区代码,大部分场景能直接对应布局,但部分多语言地区可能需要结合inputModeIdentifier,因为标识符字符串里会明确包含布局名称(比如fr_FR@sw=AZERTY;hw=Automatic)。
  • 记得在页面销毁时移除通知监听,避免内存泄漏:
    deinit {
         NotificationCenter.default.removeObserver(self)
     }
    

内容的提问来源于stack exchange,提问作者dor sahar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:30:43