我希望我的所有文本字段都能实时做出反应,我希望他们都能捕获所输入的字符并做相应的事情,但似乎我无法在{{1}内部得到两个声明来协调一致} 方法。这是我试图完成的代码:
textField:shouldChangeCharactersInRange
代码的第一个语句在func中单独工作时有效,但是当我尝试添加第二个语句时,我只是得到以下错误:
为什么呢?我应该如何正确地实现这一目标?
我有最后一个方法在函数中实现,如果已经使用了用户名,它将实时检查:
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
}
答案 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。