Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 需要解释UITextField最大长度实现吗_Ios_Swift - Fatal编程技术网

Ios 需要解释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)

因此,我成功地实现了在以下链接中限制UITextField大小的解决方案 然而,我不明白为什么你必须使用

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
    ,以允许更改)