shouldChangeCharactersInRange 多个文本字段被冻结
shouldChangeCharactersInRange multiple text fields gets frozen
更新了下面的代码和解决方案。
这适用于您想要的任意多个字段。
它还修复了方法 return 为 false 时文本字段冻结的问题。
下面的行是在 return 为 false 之后将方法引导至 return true 的内容。
newString = currentString.stringByReplacingCharactersInRange(range, withString: string)
在视图中加载(这将为每个字段添加一个标识符,以便您可以在方法中识别正在使用的字段 - 它是一个 Int())
emailAddressField.tag = 1
userPasswordField.tag = 2
关于委托方法
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
var maxLength = Int()
var newString = NSString()
var currentString = NSString()
println("MY TAG \(textField.tag)")
switch textField.tag {
case 1:
println("CASE 1 \(range)")
maxLength = 16
currentString = emailAddressField.text
newString = currentString.stringByReplacingCharactersInRange(range, withString: string)
case 2:
println("CASE 2 \(range)")
maxLength = 8
currentString = userPasswordField.text
newString = currentString.stringByReplacingCharactersInRange(range, withString: string)
default:
println("Didn't detect any field")
}
return newString.length <= maxLength
}
问题是委托方法 shouldChangeCharactersInRange
用于两个文本字段,在您的实现中,一旦其中一个文本字段达到其限制,您将返回 false
,这最终使得两个文本字段都拒绝进一步输入。要解决此问题,您需要检查方法的 textField
参数以确定调用该方法的文本字段。
一种可能的方法是在您的两个文本字段上设置标签,例如在 viewDidLoad
、
override func viewDidLoad() {
...
emailAddressField.tag = EMAIL_ADDRESS_TEXTFIELD // e.g. 0
userPasswordField.tag = USER_PASSWORD_TEXTFIELD // e.g. 1
}
然后根据提供给委托方法的文本字段的标签进行操作
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let newString = textField.text!.stringByReplacingCharactersInRange(range, withString: string)
if textField.tag == EMAIL_ADDRESS_TEXTFIELD && count(newString) + 1 == 30 {
return false
}
if textField.tag == USER_PASSWORD_TEXTFIELD && count(newString) + 1 == 11 {
return false
}
return true
}
更新了下面的代码和解决方案。
这适用于您想要的任意多个字段。
它还修复了方法 return 为 false 时文本字段冻结的问题。
下面的行是在 return 为 false 之后将方法引导至 return true 的内容。
newString = currentString.stringByReplacingCharactersInRange(range, withString: string)
在视图中加载(这将为每个字段添加一个标识符,以便您可以在方法中识别正在使用的字段 - 它是一个 Int())
emailAddressField.tag = 1
userPasswordField.tag = 2
关于委托方法
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
var maxLength = Int()
var newString = NSString()
var currentString = NSString()
println("MY TAG \(textField.tag)")
switch textField.tag {
case 1:
println("CASE 1 \(range)")
maxLength = 16
currentString = emailAddressField.text
newString = currentString.stringByReplacingCharactersInRange(range, withString: string)
case 2:
println("CASE 2 \(range)")
maxLength = 8
currentString = userPasswordField.text
newString = currentString.stringByReplacingCharactersInRange(range, withString: string)
default:
println("Didn't detect any field")
}
return newString.length <= maxLength
}
问题是委托方法 shouldChangeCharactersInRange
用于两个文本字段,在您的实现中,一旦其中一个文本字段达到其限制,您将返回 false
,这最终使得两个文本字段都拒绝进一步输入。要解决此问题,您需要检查方法的 textField
参数以确定调用该方法的文本字段。
一种可能的方法是在您的两个文本字段上设置标签,例如在 viewDidLoad
、
override func viewDidLoad() {
...
emailAddressField.tag = EMAIL_ADDRESS_TEXTFIELD // e.g. 0
userPasswordField.tag = USER_PASSWORD_TEXTFIELD // e.g. 1
}
然后根据提供给委托方法的文本字段的标签进行操作
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let newString = textField.text!.stringByReplacingCharactersInRange(range, withString: string)
if textField.tag == EMAIL_ADDRESS_TEXTFIELD && count(newString) + 1 == 30 {
return false
}
if textField.tag == USER_PASSWORD_TEXTFIELD && count(newString) + 1 == 11 {
return false
}
return true
}