我有一个只接受数值的文本字段。我想知道如何能够输入单个'。'的能力。表示小数点。
我有以下代码:
class ViewController: UIViewController, UITextFieldDelegate {
var formatter: NSNumberFormatter!
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
return string == "" || Double(string) != nil
}
override func viewDidLoad() {
amountTextField.delegate = self
// Initialize the formatter; minimum value is set to zero; style is Decimal.
formatter = NSNumberFormatter()
formatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
formatter.minimum = 0
}
}
答案 0 :(得分:1)
您必须使用此文本字段委托方法:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { // return NO to not change text
let newString = (textField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string)
if newString.characters.count > 0 {
let scanner: NSScanner = NSScanner(string:newString)
let isNumeric = scanner.scanDecimal(nil) && scanner.atEnd
return isNumeric
} else {
return true
}
}
答案 1 :(得分:0)
您可以将目标操作与.EditingChanged
事件一起使用,而不是使用此委托方法,因为它不方便(在更改后不会为您提供文本的值)并且不总是有效(例如,自动更正)。
在.EditingChanged
的处理程序中,您可以使用regexp处理输入的文本。使用这种方法,您将不得不保留旧的文本值。
示例代码:
let decimalRegex = try! NSRegularExpression(pattern: "^[0-9]+(\\.[0-9]+)?$", options: [])
func isValidText(text: String) -> Bool {
return text == "" || decimalRegex.numberOfMatchesInString(text, options: [], range: NSMakeRange(0, text.utf16.count)) != 0
}
textField.addTarget(self, action: #selector(self.textFieldTextChanged(_:)), forControlEvents: .EditingChanged)
var oldText = ""
func textFieldTextChanged(textField: UITextField) {
if isValidText(textField.text!) {
oldText = textField.text!
} else {
textField.text = oldText
}
}