先贴代码,逻辑思维在下面。
import UIKit
class ViewController: UIViewController ,UITextFieldDelegate{
var textField:UITextField!
var isFirst = true
var rangePoint:NSRange!
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.whiteColor()
textField = UITextField(frame: CGRectMake(50,200,200,40))
view.addSubview(textField)
textField.backgroundColor = UIColor.lightGrayColor()
textField.borderStyle = .RoundedRect
textField.clearButtonMode = .WhileEditing
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 {
print("range:\(range) rangeLenght:\(range.length) rangeLocation:\(range.location) string:\(string)")
if string == "" || string == "\n" {
if rangePoint != nil {
if range.location == rangePoint.location {
isFirst = true
}
}
return true
}
if ( Int(string) <= 9 && Int(string) >= 0 ) || string == "." {
if isFirst == true {
if string == "." {
isFirst = false
rangePoint = range
return true
}
}else if isFirst == false {
if string == "." {
return false
}else if range.location - rangePoint.location > 2 {
return false
}
}
}else {return false}
return true
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
print(textField.text)
textField.resignFirstResponder()
return true
}
func textFieldShouldClear(textField: UITextField) -> Bool {
return true
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
创建UITextField
<span style="font-size:18px;">var textField:UITextField!</span>
展示textField,别忘了添加UITextFieldDelegate
<span style="font-size:18px;">textField = UITextField(frame: CGRectMake(50,200,200,40))
view.addSubview(textField)
textField.backgroundColor = UIColor.lightGrayColor()
textField.borderStyle = .RoundedRect
textField.clearButtonMode = .WhileEditing
textField.delegate = self</span>
以下内容都是在func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {}方法中扩展
第一步:打印一些有利于思考的参数
print("range:\(range) rangeLenght:\(range.length) rangeLocation:\(range.location) string:\(string)")
第二步:判断输入点号
if string == "." { return true}
第三步:思考第二次输入点号的时候应该返回false,由此增加一个参数isFirst做控制(var isFirst = true)
if isFirst == true {
if string == "." {
isFirst = false
return ture
}
}else if isFirst == false {
if string == "." {
return false
}
}
第四步: 思考输入小数点之后,如何限制输入小数点后两位,由此增加一个参数rangePoint纪录小数点输入时的NSRange(var rangePoint:NSRange!)
if isFirst == true {
if string == "." {
isFirst = false
rangePoint = range
return ture
}
}else if isFirst == false {
if string == "." {
return false
}else if range.location - rangePoint.location > 2 {
return false
}
}
第五步:经过前面四步,已经实现了输入小数点后两位字符,但没有限制只限数字,所以这一步要做的就是限制输入数字或小数点
if (Int(string) <= 9 && Int(string) >= 0 ) || string == "." {
if isFirst == true {
if string == "." {
isFirst = false
rangePoint = range
return ture
}
}else if isFirst == false {
if string == "." {
return false
}else if range.location - rangePoint.location > 2 {
return false
}
}
}else {return false }第六步:在接下来的测试中发现,无法输入删除键或者回车键了,通过开始的print命令发现,输入删除键时打印“” 输入回车键时打印换行
if string == "" || string == "\n" {
return true
}
if (Int(string) <= 9 && Int(string) >= 0 ) || string == "." {
if isFirst == true {
if string == "." {
isFirst = false
rangePoint = range
return ture
}
}else if isFirst == false {
if string == "." {
return false
}else if range.location - rangePoint.location > 2 {
return false
}
}
}else {return false }第七步:删除键和回车键输入正常了,通过以下方法打断点判断
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
func textFieldShouldClear(textField: UITextField) -> Bool {
return true
}
第八步:测试的时候发现,当输入第一个小数点后,删除该小数点,无法继续输入小数点,所以需要判断是否删除了第一个输入的小数点
if string == "" || string == "\n" {
if range.location == rangePoint.location {
isFirst = true
}
return true
}
if (Int(string) <= 9 && Int(string) >= 0 ) || string == "." {
if isFirst == true {
if string == "." {
isFirst = false
rangePoint = range
return ture
}
}else if isFirst == false {
if string == "." {
return false
}else if range.location - rangePoint.location > 2 {
return false
}
}
}else {return false }
if string == "" || string == "\n" {
if rangePoint != nil {
if range.location == rangePoint.location {
isFirst = true
}
}
return true
}
if ( Int(string) <= 9 && Int(string) >= 0 ) || string == "." {
if isFirst == true {
if string == "." {
isFirst = false
rangePoint = range
return true
}
}else if isFirst == false {
if string == "." {
return false
}else if range.location - rangePoint.location > 2 {
return false
}
}
}else {return false}
return true
第十步:尽量考虑了所有情况了,但我的大脑也许也受限制了,忽略了某些情况,如果有朋友发现了请评论提醒一下 :)
最后思考一下简化一下代码,发现有一句还是可以简化的
if string == "" || string == "\n" {
if rangePoint != nil {
if range.location == rangePoint.location {
isFirst = true
}
}
return true
}
if ( Int(string) <= 9 && Int(string) >= 0 ) || string == "." {
if isFirst == true {
if string == "." {
isFirst = false
rangePoint = range
return true
}
}else if isFirst == false {
if string == "." || range.location - rangePoint.location > 2 {
return false
}
// if string == "." {
// return false
// }else if range.location - rangePoint.location > 2 {
// return false
// }
}
}else {return false}
return true
}