函数textField捕获错误但仍然显示错误的字符

时间:2017-03-09 01:07:45

标签: swift textfield

在函数textField中,第二部分(以' let ...'开头)通过查找尝试将多个小数点输入textField来完美地执行,而不是允许在textField中显示多个小数点。

问题在于第一部分。在这里,它首先尝试查找是否键入了字母字符。它确实认识到发生了这种情况,然后退出了“假”。

与代码的重复小数查找部分不同,textField显示坏字符而不是跳过它。

也许我不明白这种委托方法是如何工作的。我虽然该方法以某种方式返回false,但它会阻止将该字符添加到textField显示中。

func textField(_ textField:UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    for scalar in (textField.text?.unicodeScalars)! {
      if NSCharacterSet.letters.contains(scalar) {
        print("letter scalar found: \(scalar.value),  false")
        return false
      }
    }

    let existingTextHasDecimalSeperator = textField.text?.range(of: ".")  // search textField for '.', can be 'nil'
    let replacementTextHasDecimalSeperator = string.range(of: ".")        // next character is '.',    can be 'nil'
    if existingTextHasDecimalSeperator != nil, replacementTextHasDecimalSeperator != nil {
      return false
    } else {
      return true
    }
  }

2 个答案:

答案 0 :(得分:0)

这是因为您正在搜索现有的textField.text,而不是搜索字符的新字符(replacementString)。

(textField.text?.unicodeScalars)!更改为string.unicodeScalars,您应该设置。

答案 1 :(得分:0)

func textField(_ textField:UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    for scalar in string.unicodeScalars {
      if NSCharacterSet.letters.contains(scalar) {
        print("letter scalar found: \(scalar.value),  false")
        return false
      }
    }

    let existingTextHasDecimalSeperator = textField.text?.range(of: ".")  // search textField for '.', can be 'nil'
    let replacementTextHasDecimalSeperator = string.range(of: ".")        // next character is '.',    can be 'nil'
    if existingTextHasDecimalSeperator != nil, replacementTextHasDecimalSeperator != nil {
      return false
    } else {
      return true
    }
  }

将搜索从textField替换为字符串的建议有效!这是一个有效的swift 3.0版本列表。