需要解释UITextField最大长度实现

时间:2015-04-02 01:32:20

标签: ios swift

因此,我成功实施了解决方案,以限制以下链接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位数,但第一种解决方案允许用户使用退格键删除字符,但第二种解决方案(我的初始解决方案)不允许用户使用退格键删除字符。有人可以解释一下吗?

2 个答案:

答案 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)

您需要考虑许多方案,例如,您可以选择一系列文字,然后将其替换为多个字符,甚至没有,这就是您需要评估的原因:

  1. TextField中的字符
  2. 将添加到文本字段的字符(可能是多个字符,您可以粘贴剪贴板中的内容)
  3. 减去要替换的字符(所选文本)。
  4. 希望这有帮助。