在Swift中,如何在数字键盘上添加小数点?

12
如何在数字键盘上添加小数点? 当我使用通知UIKeyboardDidShowNotification时,我希望一个UIButton出现在数字键盘的下方左侧。
这将是按钮的框架: let dotButton = UIButton(frame: CGRectMake(0, 162, view.frame.width/3, 54)), 但它必须作为数字键盘的子视图添加,以防止被其遮挡。该如何实现?
编辑: 我成功让按钮出现在数字键盘下方左侧。
    dotButton.addTarget(self, action: "addDot:", forControlEvents: .TouchUpInside)
    dotButton.setTitle(".", forState: .Normal)
    dotButton.titleLabel?.font = UIFont(name: "Helvetica Neue", size: 25)
    dotButton.setTitleColor(UIColor.blackColor(), forState: .Normal)
    dispatch_async(dispatch_get_main_queue(), {
        let keyboardView:UIView = UIApplication.sharedApplication().windows.last?.subviews.first as! UIView
        self.dotButton.frame = CGRectMake(0, keyboardView.frame.size.height-54, self.view.frame.width/3, 54)
        keyboardView.addSubview(self.dotButton)
        keyboardView.bringSubviewToFront(self.dotButton)
    })

现在我不知道如何当我点击按钮调用addDot方法时,告诉textField添加一个.。需要再次寻求帮助...

编辑2: 我创建了一个类变量 textFieldInEdit:UITextField! 并在 func textFieldShouldBeginEditing(textField: UITextField) -> Bool 中执行 textFieldInEdit = textField,现在我的 addDot 函数是这样的:

textFieldWhichEdit.text = "\(textFieldWhichEdit.text)." ,

但是我现在又遇到另一个问题...我有不同键盘类型的字段,如何检测并仅在数字键盘上显示点号?

编辑3:

func textFieldDidBeginEditing(textField: UITextField) {
    if(textField.keyboardType.rawValue==4){
        textFieldWhichEdit = textField
        dotButton.hidden = false
    }else{
        dotButton.hidden = true
    }
}

完成了!我在数字键盘上加了一个点按钮 :) 如果有更好的方法,可以写下来,我会接受这个答案 :)


您可以使文本域接受逗号作为小数点输入。 - Leo Dabus
https://dev59.com/fl4c5IYBdhLWcg3wHHCY#28314223 - Leo Dabus
@HoaParis 我复制了你给我的代码,现在我又遇到了另一个问题,请再检查一下问题,我写了一个更新。 - Bogdan Bogdanov
我添加了另一种解决方案的答案。这个链接提供的解决方案是在工具栏中添加按钮,而不是键盘布局。 - Duyen-Hoa
请查看此答案 https://dev59.com/wFsW5IYBdhLWcg3wDzvs#46359365 - Naveen Kumar M
显示剩余7条评论
2个回答

38

yourTextField.keyboardType = .decimalPad


6
十进制小数点用“,”而不是“。”。 - Savas Adar
6
@SavasAdar的句子中有一个逗号是由于本地化所致。 - Julio Bailon
我希望我的TF在按下小数点时将小数点视为第一个字符。如果有人直接输入“。”,我将编写逻辑以在第一个位置附加“0”。 - Manish Pathak
这在iOS 13上无法工作。没有出现任何标点符号按钮。 - Pedro Paulo Amorim

0
将UITextfieldDelegate添加到您的控制器中,然后将文本字段重新链接到IBOulet(例如tfTest),然后像这样实现shouldChangeCharactersInRange回调。
@IBOutlet weak var tfTest: UITextField!

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    var newText: NSString = textField.text as NSString
    newText = newText.stringByReplacingCharactersInRange(range, withString: string)

    var isEmptyNew = (newText as String).rangeOfString(".", options: NSStringCompareOptions.allZeros, range: nil, locale: nil)?.isEmpty ?? true

    if isEmptyNew {
        //change to decimal pad as we allow to add decimal point now
        textField.keyboardType = UIKeyboardType.DecimalPad

        //refresh responder to change keyboard layout
        textField.resignFirstResponder()
        textField.becomeFirstResponder()
        return true;
    }

    var isEmptyOld = textField.text.rangeOfString(".", options: NSStringCompareOptions.allZeros, range: nil, locale: nil)?.isEmpty ?? true

    //if pressed button is the dot and your text field has already a dot, do not allow this. Normally, this case does not happen cause your keyboard type was changed to number pad before
    if string == "." && !isEmptyOld {
        return false
    } else {
        //show just numbers
        textField.keyboardType = UIKeyboardType.NumberPad
        //refresh responder to change keyboard layout
        textField.resignFirstResponder()
        textField.becomeFirstResponder()

        return true
    }
}

为了避免与小数点分隔符(.或,)相关的问题,请使用以下代码检索小数点分隔符,并使用它来替代硬编码的值。
let df  = NSNumberFormatter()
df.locale = NSLocale.currentLocale()

let decimalPoint = df.decimalSeparator ?? "."

不,几个月前我做过,但我删除了代码,现在我不记得怎么做了... - Bogdan Bogdanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接