使用 shouldChangeCharactersInRange 在 UITextField 验证中考虑退格

Posted

技术标签:

【中文标题】使用 shouldChangeCharactersInRange 在 UITextField 验证中考虑退格【英文标题】:Accounting for backspace in UITextField validation using shouldChangeCharactersInRange 【发布时间】:2016-07-17 14:46:14 【问题描述】:

我正在尝试在 textField 中进行验证,以确保它只包含字母。在我按下退格键之前它一直有效。

作为一种解决方法,我尝试创建一个NSMutableCharacterSet 并使用formUnionWithCharacterSet 添加NSCharacterSet.letterCharacterSet()。然后我添加了退格键。那也不行。

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool         
    // Limit to Letters & Backspace
    // let charactersAllowed = NSCharacterSet.letterCharacterSet()
    let charactersAllowed = NSMutableCharacterSet()
    charactersAllowed.formUnionWithCharacterSet(NSCharacterSet.letterCharacterSet())
    charactersAllowed.addCharactersInString("\\b")

    if let rangeOfCharactersAllowed = string.rangeOfCharacterFromSet(charactersAllowed, options: .CaseInsensitiveSearch) 
        return rangeOfCharactersAllowed.count == string.characters.count
     else 
        displayAlert("Invalid Character", alertMessage: "Please enter only letters")
        return false
    

我在 Objective-C 中找到了一些老生常谈的答案,但它们似乎都不适合我。去NSMutableCharacterSet路由验证有什么其他建议吗?

如果有帮助,我正在使用模拟器并尝试按键盘右上角的退格键(删除)。

【问题讨论】:

见developer.apple.com/library/ios/documentation/UIKit/Reference/… @danh 谢谢。我会着手弄清楚如何处理它。 【参考方案1】:

试试这个:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool 
  let notLetterSet = NSCharacterSet.letterCharacterSet().invertedSet
  let textFieldInvalidCharPosition = string.rangeOfCharacterFromSet(notLetterSet)

if (textFieldInvalidCharPosition != nil) 
     return false
   else 
     return true
  

【讨论】:

以上是关于使用 shouldChangeCharactersInRange 在 UITextField 验证中考虑退格的主要内容,如果未能解决你的问题,请参考以下文章

Swift 5 - 用 X 屏蔽文本字段文本

测试使用

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)