Ios 需要解释UITextField最大长度实现吗
因此,我成功地实现了在以下链接中限制UITextField大小的解决方案 然而,我不明白为什么你必须使用Ios 需要解释UITextField最大长度实现吗,ios,swift,Ios,Swift,因此,我成功地实现了在以下链接中限制UITextField大小的解决方案 然而,我不明白为什么你必须使用 var newLength = countElements(textField.text) + countElements(string) - range.length return !(newLength > 5) 而不是我最初的解决方案 var newLength = countElements(textField.text) return !(newLength > 4)
var newLength = countElements(textField.text) + countElements(string) - range.length
return !(newLength > 5)
而不是我最初的解决方案
var newLength = countElements(textField.text)
return !(newLength > 4)
两种解决方案都将UITextField中的字符串大小限制为5位,但第一种解决方案允许用户使用退格删除字符,但第二种解决方案(我的初始解决方案)不允许用户使用退格删除字符。有人能解释一下吗? 你有很多ESCNEARIONS要考虑,例如,你可以选择一系列文本,然后替换它为许多字符,甚至没有,这就是为什么你需要评估:
希望这有帮助。假设问题中的代码片段是从这个
UITextFieldDelegate
方法中提取的:
textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
当你意识到苹果公司试图让他们的方法名用通俗易懂的英语可读时,问题就变得非常清楚了。此方法称为应更改字符。方法名称的动词时态表示在更改文本字段的字符之前调用该方法。它返回一个Bool
。它问我们是否应该改变角色
重要的是,这意味着无论textField.text是什么,它都没有考虑用户试图进行的更改。同样重要的是,当用户按下delete/backspace键时,以及当用户选择一系列文本并粘贴新内容时,都会调用此方法
那么,为什么第二种方法在某些情况下会失败呢
您的目标是确保最大长度为一定数量的字符,对吗?如果我们按backspace键,我们的委托方法将被调用,范围为最后一个索引,长度为1(我们正在删除最后一个字符),string
参数将是空字符串:“
。如果我们返回true
,字符串的长度将缩短一个字符
但是请记住,textField.text
仍然保持与用户按下按钮之前相同的值。您的方法将查看长度,看到字符串已经达到最大长度,并且不允许所有更改,因为您的方法假设对的任何调用都应该更改CharactersRange
意味着长度在增加,但事实并非如此
另一种方法计算如果我们将true
返回到此方法的长度,并基于该计算,适当地返回true或false
实际上,range
变量的length
部分是用户从textField.text中删除的字符数,string
变量的length
部分是用户添加到textField中的字符数。text
如果这个问题包括此代码所在的上下文,将非常有帮助。您是从哪里返回的?这是一个作业,我使用的文本字段应限制为5位数字(邮政编码),这更像是一个使用代理的课程,但我宁愿理解一个可用的场景(能够纠正您的键入),而不仅仅是知道如何设置代理是,但该逻辑应用于哪种委托方法对于解释场景至关重要。也就是说,我认为我的回答充分解释了基于此逻辑中委托方法的假设。对不起,是的,我使用的正确委托方法是textField(textField:UITextField,shouldChangeCharactersInRange:NSRange,replacementString:string)->Bool
这太棒了,谢谢!我认为最大的启示是textField.text
不是UI中文本窗口中显示的内容,而是在用户请求向UI输入另一个字符之前显示的字符串。一些println()
消息显示了这一点(例如countElements(textField.text)
不会仅仅因为您点击了backspace而更改值,因为它是输入或删除字符之前向UI输出的上一次计数,因此Bool不能更改回true
,以允许更改)