iOS委托以防止无效输入

时间:2016-06-16 22:00:01

标签: ios swift delegates

我正在学习iOS开发,并试图阻止UITextField具有多个十进制值的值,例如“45.3.1”和字母字符。

防止字母字符功能无法正常工作。如果我在文本字段中输入数字时打印alphabeticString,我会得到nil但是当我输入“a”这样的字符时打印alphabeticString我得到一个可选范围。出于某种原因,即使alphabeticString打印为nil,当插入字符时,我的if语句也会返回true。

有什么原因吗?感谢。

func textField(textField: UITextField,
        shouldChangeCharactersInRange range: NSRange,
        replacementString string: String) -> Bool {

    let existingTextHasDecimalSeperator = textField.text?.rangeOfString(".")
    let replacementTextHasDecimalSeparator = string.rangeOfString(".")
    let alphabeticString = string.rangeOfCharacterFromSet(NSCharacterSet.letterCharacterSet())

    if existingTextHasDecimalSeperator != nil && replacementTextHasDecimalSeparator != nil && alphabeticString != nil {
        return false
    }
    else {
        return true
    }
}

2 个答案:

答案 0 :(得分:1)

嗯,我不确定为什么那不起作用。为什么不为func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { switch string { case "0","1","2","3","4","5","6","7","8","9": return true case ".": if let _ = textField.text?.rangeOfString("."){ return false }else{ return true } default: if let _ = string.rangeOfCharacterFromSet(NSCharacterSet.letterCharacterSet()){ return false } return true } } 使用“十进制键盘”键盘类型?

如果由于某种原因你不想这样做,试试这个:

if

编辑:我认为我在代码中发现了问题,您需要将func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { let existingTextHasDecimalSeperator = textField.text?.rangeOfString(".") let replacementTextHasDecimalSeparator = string.rangeOfString(".") let alphabeticString = string.rangeOfCharacterFromSet(NSCharacterSet.letterCharacterSet()) if (existingTextHasDecimalSeperator != nil && replacementTextHasDecimalSeparator != nil) || alphabeticString != nil { return false } else { return true } } 语句分为两个条件:

@Html.Commentbox(m => m.Message);

答案 1 :(得分:1)

我更喜欢使用谓词。他们让生活更轻松! 在您的情况下,代码将是下一个:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        guard (textField.text != nil) && (string != "") else { return true }
        let predicate = NSPredicate(format: "SELF MATCHES %@", "[0-9]{1,}+\\.{0,1}[0-9]{0,}")
        let resultString = (textField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string)
        return predicate.evaluateWithObject(resultString)
}

只需4行。

祝你好运!