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

iOS 11下Decimal Pad UITextField与Bitmoji键盘切换异常问题

解决Bitmoji键盘无法切换到Decimal Pad的问题

这个坑我之前做金融类APP的时候踩过!第三方自定义键盘(比如Bitmoji)和系统特定类型键盘(比如Decimal Pad)之间经常会有这种兼容问题——当用户当前用的是Bitmoji键盘时,点击设置了Decimal Pad的输入框,系统不会自动切换到数字键盘,甚至连切换用的地球图标都消失了。下面给你几个实测有效的解决办法:

方法一:在编辑开始时强制指定键盘类型

利用UITextField的代理方法或者编辑事件,在输入框即将开始编辑时,重新设置一次键盘类型,确保系统优先加载我们需要的Decimal Pad:

Swift 实现

方式1:使用代理方法

先让你的ViewController遵循UITextFieldDelegate,然后实现:

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    // 替换成你自己的Decimal Pad输入框引用
    if textField === decimalAmountTextField {
        // 重新设置键盘类型,触发系统加载正确的键盘
        textField.keyboardType = .decimalPad
    }
    return true
}

方式2:使用编辑事件监听

如果不想用代理,可以直接给输入框添加编辑开始的监听:

override func viewDidLoad() {
    super.viewDidLoad()
    // 绑定事件
    decimalAmountTextField.addTarget(self, action: #selector(decimalTextFieldDidBeginEditing), for: .editingDidBegin)
}

@objc private func decimalTextFieldDidBeginEditing(_ textField: UITextField) {
    textField.keyboardType = .decimalPad
    // 有时候需要先 resign 再重新成为第一响应者,确保键盘刷新
    textField.resignFirstResponder()
    DispatchQueue.main.async {
        textField.becomeFirstResponder()
    }
}

Objective-C 实现

// 代理方法
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    if (textField == self.decimalAmountTextField) {
        textField.keyboardType = UIKeyboardTypeDecimalPad;
    }
    return YES;
}

// 或者事件监听
- (void)viewDidLoad {
    [super viewDidLoad];
    [self.decimalAmountTextField addTarget:self action:@selector(decimalTextFieldDidBeginEditing:) forControlEvents:UIControlEventEditingDidBegin];
}

- (void)decimalTextFieldDidBeginEditing:(UITextField *)textField {
    textField.keyboardType = UIKeyboardTypeDecimalPad;
    [textField resignFirstResponder];
    dispatch_async(dispatch_get_main_queue(), ^{
        [textField becomeFirstResponder];
    });
}

方法二:限制输入框仅使用系统键盘(可选)

如果你的APP不需要支持第三方自定义键盘,可以直接强制输入框使用系统键盘:

decimalAmountTextField.inputViewController = nil

这个方法比较极端,适合完全不需要第三方键盘的场景,优点是一劳永逸,缺点是会剥夺用户使用自定义键盘的权利,所以根据你的APP需求来选。

问题根源解释

第三方自定义键盘(比如Bitmoji)通常只适配了系统的默认键盘类型,当输入框指定了特殊类型(比如decimalPad)时,第三方键盘无法提供对应的输入界面,系统本应该自动切换到系统键盘,但有时候会因为第三方键盘的钩子逻辑导致切换失败。重新设置键盘类型并刷新响应者状态,能强制系统忽略当前的第三方键盘,加载我们指定的系统键盘。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:08:42