【问题标题】:Only allow letters and numbers for a UITextFieldUITextField 只允许字母和数字
【发布时间】:2014-04-11 11:23:48
【问题描述】:

我有一个注册视图控制器,用户需要在其中输入电子邮件地址、用户名和密码。

对于用户名和密码字段,您现在可以使用“user%$&”这样的用户名和“password%^&$”这样的密码进行注册。我不希望人们能够使用这些特殊字符。

我想让用户名和密码字段只能使用字母数字字符(即字母和数字)提交。我找到了一些方法来做到这一点,但它们令人困惑,我需要它来专门处理我的代码。

这是我在用户输入电子邮件、用户名和密码并按下提交按钮时执行的一些代码:

NSString *user = [_usernameEntry text];
NSString *pass = [_passwordEntry text];
NSString *email = [_emailEntry text];

self.userSubmittedUsername = user;

if ([user length] < 4 || [pass length] < 4) {

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Invalid Entry" message:@"Username and Password must both be at least 4 characters long." delegate:self cancelButtonTitle:@"Okay" otherButtonTitles:nil];

    [alert show];

} else if ([email length] < 8) {

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Invalid Entry" message:@"Please enter your email address." delegate:self cancelButtonTitle:@"Okay" otherButtonTitles:nil];

    [alert show];

} else {

我只想在上面的代码中添加另一个else if,并让它在有任何不是字母或数字的字符时显示警报视图。

谢谢。

【问题讨论】:

  • 请不要将您的密码限制在如此有限的字符中。让用户输入安全密码。
  • 为什么不在数据录入时过滤无效字符呢?防止文本字段委托方法textField:shouldChangeCharactersInRange:replacementString:中出现无效字符。
  • rmaddy 感谢您的评论,我刚刚度过了一个“啊哈”的时刻。我今天使用的一个应用程序在键盘上有 @ 符号,但如果你点击它,它并没有向 UITextField 添加任何内容。这是您在第二条评论中所说的吗?如果是,请在代码中发布您的解决方案,我会立即实施。谢谢!

标签: ios iphone objective-c if-statement uitextfield


【解决方案1】:

虽然回答迟了,还有其他简单而伟大的方法,但这个答案可能对某人有用。

这很简单,对我来说就像一个魅力。

斯威夫特 3:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    /// 1. replacementString is NOT empty means we are entering text or pasting text: perform the logic
    /// 2. replacementString is empty means we are deleting text: return true
    if string.characters.count > 0 {
        var allowedCharacters = CharacterSet.alphanumerics

        let unwantedStr = string.trimmingCharacters(in: allowedCharacters)
        return unwantedStr.characters.count == 0
    }

    return true
}

注意:这也适用于将字符串粘贴到文本字段中。如果粘贴的字符串包含任何不需要的字符,将不会在文本字段中显示。

【讨论】:

    【解决方案2】:

    如果有人最终在这里寻找 Swift 中的快速方法来执行此操作,这是我的解决方案(其中 UITextField 允许大写字母、小写字母、数字和空格。)

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    
        let set = NSCharacterSet(charactersInString: "ABCDEFGHIJKLMONPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 ").invertedSet
        return string.rangeOfCharacterFromSet(set) == nil
    
    }
    

    如果不是空间,你可以简单地使用

    let set = NSCharacterSet.alphanumericCharacterSet().invertedSet
    

    在每次按键时,我们检查输入的字符是否包含在我们的样本集中,如果没有,我们返回 false。

    【讨论】:

    • 是否还允许用户使用此解决方案复制粘贴输入?
    • 您还可以组合集合或添加/删除字符。所以你可以做类似``` var set = CharacterSet.alphanumerics set.insert(charactersIn: " ") set.invert() ```
    【解决方案3】:

    一些更好更好的方法,

    好办法

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)characters
    {
        if(textField.tag == yourTextFieldTag) {
            NSCharacterSet *allowedCharacters = [[NSCharacterSet alphanumericCharacterSet] invertedSet];
            return ([characters rangeOfCharacterFromSet:allowedCharacters].location == NSNotFound);
        }
        return YES;
    }
    

    更好的方法

    注意,即使你可以通过在.h 文件(头文件)中声明NSCharacterSet *allowedCharacters 来提高内存效率,在viewDidLoad 中你可以这样写,

    allowedCharacters = [[NSCharacterSet alphanumericCharacterSet] invertedSet];
    

    那么你就可以这样使用了,

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)characters
    {
        if(textField.tag == yourTextFieldTag) {
            return ([characters rangeOfCharacterFromSet:allowedCharacters].location == NSNotFound);
        }
        return YES;
    }
    

    【讨论】:

      【解决方案4】:

      如果你真的想限制用户输入特殊字符,那么最好的方法可能是使用shouldChangeCharactersInRange:方法

      -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
      {
          if(textField==YOUR_USER_NAME_TEXTFIELD || textField == YOUR_PASSWORD_TEXTFIELD)
          {
      
              NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"];
              for (int i = 0; i < [string length]; i++)
              {
                  unichar c = [string characterAtIndex:i];
                  if (![myCharSet characterIsMember:c])
                  {
                      return NO;
                  }
              }
      
              return YES;
          }
      
          return YES;
      }
      

      这将限制用户输入特殊字符。正如 rmaddy 指出的那样,在数据输入发生时进行这种验证总是好的。

      PS:确保为您的文本字段设置委托。

      【讨论】:

        猜你喜欢
        • 2011-11-24
        • 2012-10-08
        • 2016-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-06
        • 1970-01-01
        相关资源
        最近更新 更多