在iOS中是否可以将具有ascii功能的小数点用作UITextfield的键盘类型的键盘类型?

时间:2019-01-08 11:40:25

标签: ios uitextfield uikit

我正在编写的应用程序支持多种语言,但有1个文本字段,我希望用户仅在其中写ASCII数字(即无阿拉伯数字)和十进制分隔符。 我知道可以设置UITextfield的{​​{1}},但不幸的是,有keyboardType.decimalPad,但是asciiCapableNumberPad都不适合我的需要, t带有小数点分隔符按钮,asciiCapableNumberPad并不限制为ASCII数字。

是否可以使用decimalPad?如果不是,将用户输入限制为asciiCapableDecimalPad中仅以数字和小数点分隔的数字的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

我没有发现立即用ASCII数字和小数点分隔符强制键盘的任何方法。在iPhone 8上,当用户只有阿拉伯语键盘时,对于仅带有东部阿拉伯数字(٠١٢٣٤٥٦٧٨٩)的.decimalPad键盘将显示,当用户具有多个键盘(例如,英语键盘)时,用户将具有切换按钮以进行不同的更改数字。但这对于我的iPhone X家族来说是不正确的,我认为这是Apple方面的错误,切换按钮不存在。

我通过实现方法textField(_:shouldChangeCharactersIn:replacementString:)解决了这个问题,并在该方法内部将Eastern arabic numerals(阿拉伯语?)替换为ASCII数字(也称为Western arabic numberals),以验证键入期间输入的字符

result = [result stringByReplacingOccurrencesOfString:@"٠" withString:@"0"];
result = [result stringByReplacingOccurrencesOfString:@"١" withString:@"1"];
result = [result stringByReplacingOccurrencesOfString:@"٢" withString:@"2"];
result = [result stringByReplacingOccurrencesOfString:@"٣" withString:@"3"];
result = [result stringByReplacingOccurrencesOfString:@"٤" withString:@"4"];
result = [result stringByReplacingOccurrencesOfString:@"٥" withString:@"5"];
result = [result stringByReplacingOccurrencesOfString:@"٦" withString:@"6"];
result = [result stringByReplacingOccurrencesOfString:@"٧" withString:@"7"];
result = [result stringByReplacingOccurrencesOfString:@"٨" withString:@"8"];
result = [result stringByReplacingOccurrencesOfString:@"٩" withString:@"9"];
result = [result stringByReplacingOccurrencesOfString:@"٫" withString:@"."];

我在textFieldDidEndEditing:中也这样做。很有可能不需要执行此步骤,但是我也需要在失去焦点之后格式化数字。

此修复程序正在测试中,如果有任何问题,我会通知您。

答案 1 :(得分:0)

所有非拉丁字符串出现的Swift-5解决方案。

extension String {
    var containsNonEnglishNumbers: Bool {
        return !isEmpty && range(of: "[^0-9]", options: .regularExpression) == nil
    }

    var english: String {
        return self.applyingTransform(StringTransform.toLatin, reverse: false) ?? self
    }
}

用法-

textField.addTarget(self, action: #selector(didChangeText(field:)), for: .editingChanged)

@objc func didChangeText(field: UITextField) {
    if ((field.text?.containsNonEnglishNumbers) != nil) {
        field.text = field.text?.english
    }
}