【问题标题】:Swift - Add dot in Number Pad KeyboardSwift - 在数字键盘键盘中添加点
【发布时间】:2015-06-13 23:23:02
【问题描述】:

如何在数字键盘中添加点? 当我使用通知 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 中,我不知道如何告诉 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
    }
}

完成我在数字键盘上制作了一个点按钮 :) 如果有人知道更好的方法可以写出来,我会接受答案:)

【问题讨论】:

  • 您可以让您的文本字段接受逗号作为小数输入
  • 我想要。制作双打:)
  • 我知道我已经回答了这个问题让我找到答案
  • 非常感谢我以后会用它来保证安全,但我仍然想要 .显示在数字键盘上。

标签: swift keyboard numpad


【解决方案1】:

yourTextField.keyboardType = .decimalPad

【讨论】:

  • 小数点有“,”而不是“.”
  • @SavasAdar 你的有一个逗号,因为你的本地化。
  • 如果按下小数点,我希望我的 TF 将小数点视为第一个字符。如果有人直接输入“。”,我将编写逻辑在第一个位置附加“0”。
  • 这不适用于 iOS 13。没有出现 pontuction 按钮。
【解决方案2】:

将 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 ?? "."

【讨论】:

  • 不,几个月前,我完成了,但我删除了代码,现在我不记得该怎么做了......
猜你喜欢
  • 2012-01-25
  • 1970-01-01
  • 2023-03-15
  • 2015-12-07
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 2014-12-03
  • 2017-10-02
相关资源
最近更新 更多