textField中的多个语句:shouldChangeCharactersInRange方法?

时间:2015-08-17 23:46:17

标签: ios xcode swift uitextfield

我希望我的所有文本字段都能实时做出反应,我希望他们都能捕获所输入的字符并做相应的事情,但似乎我无法在{{1}内部得到两个声明来协调一致} 方法。这是我试图完成的代码:

textField:shouldChangeCharactersInRange

代码的第一个语句在func中单独工作时有效,但是当我尝试添加第二个语句时,我只是得到以下错误:

enter image description here

为什么呢?我应该如何正确地实现这一目标?

我有最后一个方法在函数中实现,如果已经使用了用户名,它将实时检查:

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

        let invalidCharacters = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_").invertedSet

        if textField == usernameTxt || textField == passwordTxt || textField == confirmTxt  {

            if let range = string.rangeOfCharacterFromSet(invalidCharacters, options: nil, range:Range<String.Index>(start: string.startIndex, end: string.endIndex)) {

                println("error")

                return false
            }
            return true

        }; if range.length + range.location > count(usernameTxt.text) {


          return false

        }else {

        let NewLength = count(usernameTxt.text) + count(string) - range.length

        return NewLength <= 5

        }
    return true
    }

1 个答案:

答案 0 :(得分:2)

所以,这应该有效,改进以捕捉我们在上述评论中所讨论的内容:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    let invalidCharacters = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_").invertedSet

    if textField == usernameTxt || textField == passwordTxt || textField == confirmTxt {
        if let range = string.rangeOfCharacterFromSet(invalidCharacters, options: nil, range:Range<String.Index>(start: string.startIndex, end: string.endIndex)) {
            println("error")
            return false
        }
        if textField == usernameTxt {
            if range.length + range.location > count(usernameTxt.text) {
                return false
            } else {
                let NewLength = count(usernameTxt.text) + count(string) - range.length
                return NewLength <= 5
            }
        }
        return true
    }
    return false
}

这是一个开始,但我们必须继续努力,但是,这应该按照你想要的正确顺序捕获return语句。第一个if / then将过滤掉email字段并返回false,第二个if / then如果为true则返回false,然后我们单独检查username字段,我们在用户名字段上工作并返回true或false在用户名字段中,如果这不是用户名字段,我们返回true。

现在,至于用户名部分,你想要在那里完成什么,只是陈述它,我不想通过这个逻辑思考,一旦我知道了这一点,那么我们就可以充实用户特定的任何问题if / then声明,目标是什么? AND,用户名字段的优先级是,是优先级的用户名字段的字符检查还是下一个用户名检查?我问,因为如果此函数的第二个if / then语句的用户名字段为TRUE,则此方法将终止,并且它将永远不会达到用户名的第二个if / then函数。

你的问题的第二部分,可能更好的方法是这样做,用户来自UITextFieldDelegate的委托函数拦截“RETURN KEY”按下用户当他们试图移动到下一个字段时,这将拦截此事件和CHECK以确保不使用用户名:

func textFieldShouldReturn(textField: UITextField!) -> Bool{
    if (textField === usernameTxt) {
        var isTaken: Bool = false
        var query = PFQuery(className: "_User")
        query.whereKey("username", equalTo: usernameTxt.text)
        query.findObjectsInBackgroundWithBlock {
            (objects: [AnyObject]?, error: NSError?) in
            if error == nil {
                if (objects!.count > 0){
                    isTaken = true
                    let myAlert = SCLAlertView().showError("Woah There", subTitle: "username \(textField.text) is already taken", closeButtonTitle: "Got It")
                    myAlert.alertview.contentView.backgroundColor = UIColor(red:1.0, green:0.18, blue:0.18, alpha:1.0)
                    myAlert.alertview.circleBG.backgroundColor = UIColor(red:1.0, green:0.18, blue:0.18, alpha:1.0)
                    myAlert.alertview.labelTitle.textColor = UIColor.whiteColor()
                    myAlert.alertview.contentView.layer.borderColor = UIColor(red:1.0, green:0.18, blue:0.18, alpha:1.0).CGColor
                    myAlert.alertview.viewText.textColor = UIColor.whiteColor()
                    myAlert.alertview.viewText.backgroundColor = UIColor(red:1.0, green:0.18, blue:0.18, alpha:1.0)
                } else {
                    println("Username is available. ")
                }
            } else {
                println("error")
            }
        }
    }
    return true
}

这是你上一个问题的答案,这应该是答案,这是为了确保你在函数返回之前击中用户名字段两次:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    if textField == emailTxt {
        return true
    } else {
        let invalidCharacters = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_").invertedSet
        let range2 = range
        if textField == usernameTxt || textField == passwordTxt || textField == confirmTxt {
            if let range = string.rangeOfCharacterFromSet(invalidCharacters, options: nil, range:Range<String.Index>(start: string.startIndex, end: string.endIndex)) {
                println("error")
                if textField == usernameTxt {
                    if range2.length + range2.location > count(usernameTxt.text) {
                        return false
                    } else {
                        let NewLength = count(usernameTxt.text) + count(string) - range2.length
                        return NewLength <= 5
                    }
                }
                return false
            }
            if textField == usernameTxt {
                if range.length + range.location > count(usernameTxt.text) {
                    return false
                } else {
                    let NewLength = count(usernameTxt.text) + count(string) - range.length
                    return NewLength <= 5
                }
            }
            return true
        }
        return false
    }
}

你看,第一个if / then捕获你想要的字段,第二个if / then捕获带有坏chcaraters的字段,第三个捕获用户名字段和RETURNS如果它是真或假,所以这是问题所在我在这个方法之上发布的第一个解决方案,您将希望在此方法中使用用户名长度检查两次,并且用户名字段将仅在此函数中一次性检查此长度检查。所以,我正在复制IF / THEN检查用户名的文本长度,但是没关系,它应该可行。如果您有另外一个“BOOL返回FUNCTION”,这个方法在该方法之外检查用户名的长度然后返回true或false,那将是最好的,但这也适用于代码重复1 if / then statement。