如何限制在Swift for iOS8的UITextField中只有一个十进制的条目?
我已经search了这一切,但仍似乎无法得到它的工作。 我有一个简单的iOS程序,将Farenheit转换成摄氏温度和开尔文温度。 我想限制在这个UITextField只有一个十进制的条目。 例如98.9是好的,但98..9不是。
这是我想限制只有一个小数的function。 我想要的是,如果input1个小数,那么它将不允许input另一个1,但数字仍然可以在第一个小数点后input。
func farenheitButton(sender: AnyObject) { var fVal = self.farenheitTextLabel.text var cVal = self.celsiusTextLabel.text var kVal = self.kelvinTextLabel.text if let fVal = self.farenheitTextLabel.text?.toDouble() { var fValx = self.farenheitTextLabel.text var fDoubleValue : Double = NSString (string: fValx).doubleValue var fToC = (fDoubleValue - 32) * (5/9) //convert Farenheit to Celsius formula var fToK = ((fDoubleValue - 32) / (1.8000)) + 273.15 //convert Farenheit to Kelvin formula //create string from value with a format var afToC : Double = fToC var bfToC : String = String(format:"%.4f",afToC) var afToK : Double = fToK var bfToK : String = String(format:"%.4f",afToK) celsiusTextLabel.text = bfToC kelvinTextLabel.text = bfToK } }
您可以设置UITextField.delegate = self
并使用textField(textField: UITextField,shouldChangeCharactersInRange range: NSRange,replacementString string: String)
方法来做你想做的。
以下代码将不允许您在文本字段中input多个小数点 。
func textField(textField: UITextField,shouldChangeCharactersInRange range: NSRange,replacementString string: String) -> Bool { let countdots = textField.text.componentsSeparatedByString(".").count - 1 if countdots > 0 && string == "." { return false } return true }
您应该将UITextFieldDelegate
添加到class ViewController
:
class ViewController: UIViewController, UITextFieldDelegate { ... }
然后
如果您的@IBOutlet
名称是textField
,(它可能看起来像: @IBOutlet weak var textField: UITextField!
),然后添加
override func viewDidLoad() { super.viewDidLoad() self.textField.delegate = self // Do any additional setup after loading the view, typically from a nib. }
之后你可以使用:
func textField(textField: UITextField,shouldChangeCharactersInRange range: NSRange,replacementString string: String) -> Bool { let countdots = textField.text.componentsSeparatedByString(".").count - 1 if countdots > 0 || textField.text == "." { return false } return true }
你可以使用UITextField的这个子类。 它使用与上述答案相同的原则,但代码更清晰一些。
class WMNumberTextField: UITextField, UITextFieldDelegate { override func awakeFromNib() { super.awakeFromNib() delegate = self } func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { guard let text = text else { return false } let dots = text.characters.filter { $0 == "." } return dots.count == 0 || string != "." } }
我使用下面的代码来限制在swift 3.0中的1个十进制条目。
let inverseSet = CharacterSet(charactersIn:".0123456789").inverted let components = string.components(separatedBy: inverseSet) let filtered = components.joined(separator: "") if (textField.text?.contains("."))!, string.contains(".") { return false } return string == filtered
Swift 3
func textField(_ textField: UITextField,shouldChangeCharactersIn range: NSRange,replacementString string: String) -> Bool { let countdots = (textField.text?.components(separatedBy: (".")).count)! - 1 if (countdots > 0 && string == "."){ return false } return true }