在UITextField Swift中只允许使用Alphabet和空格

时间:2017-06-07 07:03:39

标签: swift swift3

我想验证我的textField只检查Alphabet&允许的空格,如果给出了数字,那么它将返回警告错误。

//First I declare my value to variable
var nameValue: String = mainView.nameTextField.text!

//Then I declare this 
 let set = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ")        

//And this is the validation
if(nameValue.rangeOfCharacter(from: set.inverted) != nil ){
    self.showAlert(message: "Must not contain Number in Name")
   } else {
      //other code
   }


ex: nameValue : "abcd" it works, but 
if nameValue : "ab cd" whitespace included, it returns the showAlert message.

此代码有效但仅适用于字母表,我现在需要的是字母和空格。而且我猜的是硬编码。也许你们这个案例有更好的代码和选项。

谢谢。

7 个答案:

答案 0 :(得分:7)

最简单的方法是在字符集中添加新行,如

function splitOnWhitespaceOutsideBalancedParens() {
  var item = '', result = [], stack = 0, whitespace = /\s/;
  for (var i=0; i < text.length; i++) {
    if ( text[i].match(whitespace) && stack == 0 ) {
        result.push(item);
        item = '';
        continue;
    } else if ( text[i] == '(' ) {
        stack++;
    } else if ( text[i] == ')' ) {
        stack--;
    }
    item += text[i];
  }
  result.push(item);
  return result;
}

var text = "contrast(200%) drop-shadow(rgba(0, 0, 0, 0.5) 0px 0px 10px)";
console.log(splitOnWhitespaceOutsideBalancedParens(text));

即,在包含的字符集的末尾添加空格字符&#34; &#34;

您可以使用像

这样的正则表达式,而不是硬编码
let set = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ ")

答案 1 :(得分:3)

使用正则表达式:

let regex = try! NSRegularExpression(pattern: "[a-zA-Z\\s]+", options: [])

你可以这样匹配:

let range = regex.rangeOfFirstMatch(in: string, options: [], range: NSRange(location: 0, length: string.characters.count))
return range.length == string.characters.count

答案 2 :(得分:1)

  

首先,您必须自己继承UITextFieldDelegate类   课

class ViewController: UIViewController, UITextFieldDelegate {
  

第二次添加IBOutlet

@IBOutlet weak var firstName: UITextField!
  

第三个必须确保该对象正在使用

override func viewDidLoad() {
        super.viewDidLoad()
   firstName.delegate = self
}


func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if textField == firstName {
                let allowedCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
                let allowedCharacterSet = CharacterSet(charactersIn: allowedCharacters)
                let typedCharacterSet = CharacterSet(charactersIn: string)
                let alphabet = allowedCharacterSet.isSuperset(of: typedCharacterSet)
                return alphabet


      }
  }

答案 3 :(得分:1)

  

pattern: ".*[^A-Za-z0-9 ].*"允许输入字符,数字,   或space(“”)

     

pattern: ".*[^A-Za-z ].*"允许输入字符或空格(“   “)

     

pattern: ".*[^A-Za-z].*"仅允许输入字符

下面的示例

extension [YourViewController]: UITextFieldDelegate
{
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
                do {
                    let regex = try NSRegularExpression(pattern: ".*[^A-Za-z0-9 ].*", options: [])
                    if regex.firstMatch(in: string, options: [], range: NSMakeRange(0, string.count)) != nil {
                        return false
                    }
                }
                catch {
                    print("ERROR")
                }
            return true
    }
}

答案 4 :(得分:0)

以上所有解决方案都不错,但仅适用于英语字母([^ A-Za-z])。因此,此解决方案不适用于我,因为我的应用程序是为多语言支持而开发的。为此,我编写了一个解决方案,并且适用于所有语言。

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

    let allowedCharacter = CharacterSet.letters
    let allowedCharacter1 = CharacterSet.whitespaces
    let characterSet = CharacterSet(charactersIn: string)
    return allowedCharacter.isSuperset(of: characterSet) || allowedCharacter1.isSuperset(of: characterSet)

}

答案 5 :(得分:0)

extension String {
    var lettersAndSpaces: String {
        return components(separatedBy: CharacterSet.letters.union(.whitespaces).inverted).joined()
    }

   var isEmptyOrWhitespace: Bool {
    let whitespace = CharacterSet.whitespacesAndNewlines
    return self.trimmingCharacters(in: whitespace).isEmpty
}
}

然后您可以使用它:

if newValue.lettersAndSpaces.isEmptyOrWhitespace {
 showError()
}

顺便说一句。这也会在多个

之类的“空白”处触发

答案 6 :(得分:0)

只是一个补充;使用这样的正则表达式:[a-zA-Z\s]+仅适用于ASCII字母,不适用于unicode字符。

例如:

some string       -> Matches
some other string -> Matches
sömé øthër strīng -> NoMatches
test 漢字          -> NoMatches

如果还要匹配非ASCII字母,则可能要使用:[\p{L}\s]+\p(L)匹配来自任何语言的任何字母。