【问题标题】:How to restrict certain characters in UITextField in Swift?如何在 Swift 中限制 UITextField 中的某些字符?
【发布时间】:2016-04-28 21:34:45
【问题描述】:

我正在创建一个在启动时要求输入用户名的琐事应用程序。我想让它无法使用 #$@!^& 等字符(也包括“空格”)。我看了这篇帖子here,但它完全是用Objective-C编写的。提前致谢。

【问题讨论】:

  • 我已经为使用 Swift 的原始问题添加了答案。

标签: swift swift2 uitextfield


【解决方案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 组成的字符;所以我猜要谨慎使用。

【讨论】:

    【解决方案2】:

    由于您明确要求使用 Swift,我已经翻译了链接问题中的顶部答案。

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

    【讨论】:

    • 不能打破分号的习惯
    【解决方案3】:
    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
    }
    

    【讨论】:

    • 假设替换字符串是单个字符,但粘贴字符串时可以更多
    【解决方案4】:

    斯威夫特 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
                }
            }
    }
    

    【讨论】:

    • 假设替换字符串是单个字符,但如果粘贴可以更多
    【解决方案5】:

    所以这可能是限制空间最有效的方法。使用此用户将无法粘贴/键入 空格

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

    将下面提到的extensionsn-p 添加到 Swift 文件中;

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

    在您的 ViewController Swift 文件中,从 Storyboard 中拖出您的 Editing Changed 实例和 UITextFieldReference Outlet,如下图所示:

    使用拖拽的Instances如下:

    引用插座为:

    @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.")
        }
    }
    

    这将在用户尝试键入/粘贴它时检测并删除空格

    【讨论】:

      【解决方案6】:

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

      扩展字符串{

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

      【讨论】:

        【解决方案7】:

        Swift : 3 和不同的方法:

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

            override func viewDidLoad() {
            super.viewDidLoad()
        textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(textField:)), for: UIControlEvents.editingChanged)
         }
        

        在目标函数中,只需检测输入的字符并将其替换为空白即可。我已经对其进行了测试,它可以防止用户在文本字段中输入任何不需要的字符。

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

        【讨论】:

          【解决方案8】:

          补充@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;
          }
          

          【讨论】:

          • 去掉那些分号
          • 想到正则表达式可能是过滤字符的更简单方法。将模型更改为使用正则表达式。结果感觉更加灵活。
          • Swift 3 正则表达式示例 检查 0-9:if !(string.range(of:"^[0-9]+$", options: .regularExpression) != nil) { valid = false } 检查 0-9,A-Z:if !(string.range(of:"^[0-9A-Z]+$", options: .regularExpression) != nil) { valid = false }
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-12-25
          • 2014-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多