如何在Swift中限制UITextField中的某些字符?

时间:2016-04-28 21:34:45

标签: swift swift2 uitextfield

我正在创建一个琐事应用程序,要求在启动时使用用户名。我想不可能使用诸如#$ @!^&之类的字符。等等(也包括"空间")。我看了一下这篇文章here,但它完全是用Objective-C编写的。提前谢谢。

8 个答案:

答案 0 :(得分:3)

由于你明确要求使用Swift,我已经在链接问题中翻译了顶部asnwer。

let notAllowedCharacters = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.";

func textField(
    textField: UITextField,
    shouldChangeCharactersInRange range: NSRange,
    replacementString string: String)
    -> Bool
{
    let set = NSCharacterSet(charactersInString: notAllowedCharacters);
    let inverted = set.invertedSet;

    let filtered = string
        .componentsSeparatedByCharactersInSet(inverted)
        .joinWithSeparator("");
    return filtered != string;

}

答案 1 :(得分:2)

internal func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool{
     if let text = string{
           if text == "#" || text == "$" || text == "!"{ \\and so on
              return false
           }
     }
     return true
}

答案 2 :(得分:1)

Swift 2.3

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

        let characters = ["#", "$", "!", "&","@"]
        for character in characters{
            if string == character{
                print("This characters are not allowed")
                return false
            }
        }
}

答案 3 :(得分:1)

因此,这可能是限制空间的最强大方式。使用此用户无法粘贴/输入 空白

这是您使用 Swift 3 实现的方法。

将下面提到的extension代码段添加到Swift文件中;

extension String {

var containsWhitespace: Bool {
    for scalar in unicodeScalars {
        switch scalar.value {
        case 0x20:
            return true
        default:
            continue
        }
    }
    return false
  }
}

在您的ViewController Swift文件中,从故事板中拖出编辑已更改实例和UITextField引用插座,图中提到的那个下面:

enter image description here

使用下面提到的拖动实例:

将Outlet引用为:

@IBOutlet weak var textField: UITextField!

和编辑更改为:

 @IBAction func textChanged(_ sender: UITextField) {
    if (textField.text!.containsWhitespace) == true {
        print("Restrict/Delete Whitespace")
        emailField.deleteBackward()
    } else {
        print("If Its not Whitespace, Its allowed.")
    }
}

只要用户尝试输入/粘贴,就会检测并删除空白

答案 4 :(得分:1)

基于使用扩展程序的Swift 4 iOS 11.2.x,在此示例中测试字符串是否为有效的十六进制数。

extension String {

var containsValidCharacter: Bool {
    guard self != "" else { return true }
    let hexSet = CharacterSet(charactersIn: "1234567890ABCDEFabcdef")
    let newSet = CharacterSet(charactersIn: self)
    return hexSet.isSuperset(of: newSet)
  }
}

您可以像使用UITextFieldDelegate一样使用它。

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

答案 5 :(得分:1)

基于使用扩展程序的Swift 4 iOS 11.2.x,在此示例中测试字符串是否为有效的十六进制数。

extension String {

var containsValidCharacter: Bool {
    guard self != "" else { return true }
    let hexSet = CharacterSet(charactersIn: "1234567890ABCDEFabcdef")
    let newSet = CharacterSet(charactersIn: self)
    return hexSet.isSuperset(of: newSet)
  }
}

您可以像使用UITextFieldDelegate一样使用它。

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

虽然我在之前的帖子中读到,CharacterSets不支持由多个Unicode.Scalar组成的字符;所以我猜是谨慎使用。

答案 6 :(得分:0)

Swift:3和另一种方法:

在viewDidLoad中添加文本字段更改的目标函数:

    override func viewDidLoad() {
    super.viewDidLoad()
textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(textField:)), for: UIControlEvents.editingChanged)
 }
在目标函数中

,只需检测输入的char并将其替换为空白。我测试了它,它可以防止用户在文本字段中输入任何不需要的字符。

 func textFieldDidChange(textField: UITextField) {

    if let textInField = textField.text{
        if let lastChar = textInField.characters.last{

            //here include more characters which you don't want user to put in the text field
            if(lastChar == "*")
            {

                textField.text  = textInField.substring(to: textInField.index(before: textInField.endIndex))

            }
        }
    }

}

答案 7 :(得分:0)

补充说@Evdzhan Mustafa说的话。如果字符串为空,您想要添加一个return语句。没有它你将无法删除你的文字。修改后的代码:

Swift 3版

let notAllowedCharacters = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.";

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if string.isEmpty{
        return true
    }

    print("String: \(string)")
    let set = NSCharacterSet(charactersIn: notAllowedCharacters);
    let inverted = set.inverted;

    let filtered = string.components(separatedBy: inverted).joined(separator: "")
    print("String Filtered: \(filtered)")
    return filtered != string;
}