ios - UITextField:如何对 "Done"键使用react并验证输入

标签 ios swift uitextfield

我正在尝试为我的应用程序规范一些登录/注册要求,因此当用户选择键盘上的“完成”按钮时,我想根据他们输入的文本是否有错误来发送警报。有点像 Instagram:

enter image description here

我试图防止在输入字符串中使用常规字母和数字之外的任何字符,所以我会用这个问题一石二鸟:

1) 我如何以编程方式访问“完成”按钮以访问正确的代码,我应该使用什么方法来检测文本字段字符串中字母和数字之外的任何字符的使用?我知道如何呈现警报 View 。

最佳答案

对“完成”点击使用react

您需要实现 textFieldShouldReturn 委托(delegate)方法。在其中,您可以根据您设置的禁用字符检查文本字段的文本,并且仅在所有字符都有效时才关闭键盘。

func textFieldShouldReturn(textField: UITextField) -> Bool {
    let forbiddenChars = NSCharacterSet(charactersInString: "@(){}[]")
    for c in textField.text.utf16 {
        if forbiddenChars.characterIsMember(c) {
            println("found forbidden character")
            return false
        }
    }
    textField.resignFirstResponder()
    return true
}

处理多个文本字段

如果您有多个文本字段,则需要为每个文本字段设置 tag 属性,然后在委托(delegate)方法中根据其值进行操作。下面是根据文本字段的标签选择一组不同的无效字符的示例。

func textFieldShouldReturn(textField: UITextField) -> Bool {
    let forbiddenChars: NSCharacterSet
    if textField.tag == 0 { // e.g. password field
        forbiddenChars = NSCharacterSet(charactersInString: "@(){}[]")
    } else { // tag != 0, e.g. user name field
        forbiddenChars = NSCharacterSet(charactersInString: "*?.<>\\")
    }
    ...
}

在现实世界的应用程序中,您当然应该为标签定义常量,而不是使用文字值。

使用白名单进行字符验证

如果你想使用允许字符的白名单而不是黑名单,你只需要翻转条件。

func textFieldShouldReturn(textField: UITextField) -> Bool {
    let allowedChars = NSCharacterSet(charactersInString: "abcdefg...")
    for c in textField.text.utf16 {
        if !allowedChars.characterIsMember(c) {
            println("found forbidden character")
            return false
        }
    }
    textField.resignFirstResponder()
    return true
}

完全拒绝无效字符的输入

如果您想完全拒绝输入无效字符,您需要实现 shouldChangeCharactersInRange 委托(delegate)方法并从替换字符串中去除任何不需要的字符。

var myTextField: UITextField

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    if count(string) == 0 {
        return true
    }

    let forbiddenChars = NSCharacterSet(charactersInString: "@(){}[]")
    var correctedReplacement = ""
    for c in string.utf16 {
        if !forbiddenChars.characterIsMember(c) {
            correctedReplacement += "\(UnicodeScalar(c))"
        }
    }

    if count(correctedReplacement) > 0 {
        myTextField.text = (myTextField.text as NSString).stringByReplacingCharactersInRange(range, withString: correctedReplacement)
    }

    return false
}

限制输入的长度

不幸的是,UITextField 类没有提供内置方法来设置输入文本的最大长度。如果您想解决这个问题,您需要实现 shouldChangeCharactersInRange 委托(delegate)方法,并在达到所需的最大长度后立即从替换字符串中删除字符。

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    if count(string) == 0 {
        return true
    }

    let maxLength = 10
    var trimmedReplacement = ""
    for c in string {
        if count(textField.text) - range.length + count(trimmedReplacement) >= maxLength {
            break
        }
        trimmedReplacement += "\(c)"
    }

    if count(trimmedReplacement) > 0 {
        myTextField.text = (myTextField.text as NSString).stringByReplacingCharactersInRange(range, withString: trimmedReplacement)
    }

    return false
}

关于ios - UITextField:如何对 "Done"键使用react并验证输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32032777/

相关文章:

objective-c - iPhone 上 UILabel 中的格式化文本

iOS 在 UITableView 中创建 "copy paste"像弹出窗口(UIMenuController)

arrays - 从 swift 数组中删除每第 n 个元素

swift - SceneKit – 为什么添加聚光灯会使地板变黑?

ios - 以编程方式隐藏键盘快捷键栏iOS 13

ios - 如何检查哪个类属于AnyObject?

ios - 在 UISplitViewController 中仅隐藏 .supplementary 列

arrays - 从值为空字符串的数组中删除字典(使用高阶函数)

ios - UITextFieldDelegate 与 UITextField 控件事件

swift - 在 Swift 中使用文本字段设置 MKAnnotation 的标题