因此,我成功实施了解决方案,以限制以下链接Max length UITextField中UITextField的大小 但是,我无法理解为什么必须使用
var newLength = countElements(textField.text) + countElements(string) - range.length
return !(newLength > 5)
而不是我最初的
解决方案var newLength = countElements(textField.text)
return !(newLength > 4)
两种解决方案都将字符串大小限制为UITextField中的5位数,但第一种解决方案允许用户使用退格键删除字符,但第二种解决方案(我的初始解决方案)不允许用户使用退格键删除字符。有人可以解释一下吗?
答案 0 :(得分:2)
假设问题中的代码段是从UITextFieldDelegate
方法中提取的:
textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
当你意识到Apple试图让他们的方法名称是纯英语可读时,问题就变得非常清楚了。此方法称为应更改字符。方法名称的动词时态意味着此方法在之前被称为文本字段的字符被更改。它返回Bool
。它询问我们是否应该改变角色。
重要的是,这意味着无论textField.text
是什么,它都没有考虑用户尝试进行的更改。同样重要的是,当用户按下删除/退格键以及用户选择一系列文本并粘贴新内容时,会调用此方法。
那么,为什么第二种方法在某些情况下会失败?
您的目标是确保最大长度是一定数量的字符,对吗?如果我们按退格键,我们的委托方法将使用一系列最后索引和长度1来调用(我们将删除最后一个字符),string
参数将是一个emptry字符串:{ {1}}。如果我们返回""
,字符串的长度将缩短一个字符。
但请记住,true
仍保持与用户此时按下按钮之前相同的值。您的方法将查看长度,看到字符串已经处于最大长度,并禁止所有更改,因为您的方法假定对textField.text
的任何调用意味着增加的长度,但这根本不是案件。
如果我们要将shouldChangeCharactersInRange
返回到此方法并基于 计算,替代方法会计算的长度,它会返回true或false适当。
有效地,true
变量的length
部分是用户从range
移除的字符数,以及textField.text
部分length
部分} variable是用户添加到string
的字符数。
答案 1 :(得分:0)
您需要考虑许多方案,例如,您可以选择一系列文字,然后将其替换为多个字符,甚至没有,这就是您需要评估的原因:
希望这有帮助。