功能Textfield捕获错误,但仍然显示不良字符



在函数文本字段中,第二部分(以'let ...'开头)通过在尝试将多个小数点输入到文本字段中时找到完美的表现,并且在Textfield中不允许将小数点显示超过一个小数点。

问题在于第一部分。在这里,它试图首先找到是否已键入字母字符。它确实认识到这种情况,然后退出返回" false"。

与代码的重复小数查找部分不同,文本字段显示不良字符而不是跳过。

也许我不明白这种委派方法的目的。我虽然该方法以某种方式返回false时,它会防止该字符被添加到TextField Display中。

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
    }
  }

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

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

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版本的列表。

最新更新