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
相关产品推荐
相关产品推荐

