用解决方案更新了下面的代码。
这适用于您想要的任意多个字段。
它还修复了该方法返回 false 时文本框卡住的问题。
下面这行是引导方法在返回 false 后返回 true 的内容。
newString = currentString.stringByReplacingCharactersInRange(range, withString: string)
在 View 上加载(这将为每个字段添加一个标识符,以便您可以在方法中识别正在使用的字段 - 它是一个 Int())
emailAddressField.tag = 1
userPasswordField.tag = 2
关于委托(delegate)方法
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
}
最佳答案
问题是委托(delegate)方法 shouldChangeCharactersInRange 用于两个文本字段,并且在您的实现中,一旦其中一个文本字段到达其位置,您将返回 false最终使两个文本字段都拒绝进一步输入的限制。要解决此问题,您需要检查方法的 textField 参数以确定调用该方法的文本字段。
一种可能的方法是在你的两个文本字段上设置标签,例如在 viewDidLoad 中,
override func viewDidLoad() {
...
emailAddressField.tag = EMAIL_ADDRESS_TEXTFIELD // e.g. 0
userPasswordField.tag = USER_PASSWORD_TEXTFIELD // e.g. 1
}
然后根据提供给委托(delegate)方法的文本字段的标签进行操作
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
}
关于swift - shouldChangeCharactersInRange 多个文本字段被卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31902254/