iOS限制textfield输入两位小数逻辑思维步骤记录(Swift)

来源:互联网 发布:php网店系统源码 编辑:程序博客网 时间:2024/06/04 20:14

先贴代码,逻辑思维在下面。

import UIKitclass 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 }


第九步:测试: 输入第一个小数点后删除, 继续输入小数点正常。但是:不输入小数点的情况下删除,程序报错了,原来是因为rangePoint值为空,所以添加一条判断限制

          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
    }


0 0
原创粉丝点击