【问题标题】:Allow only alpha numeric characters in UITextView在 UITextView 中只允许字母数字字符
【发布时间】:2013-04-22 12:24:01
【问题描述】:

无论如何我可以允许用户在文本视图中只输入字母数字字符而不输入其他字符。

编辑:

试过了,

if ([_txtView.text rangeOfCharacterFromSet:alphaSet].location != NSNotFound)
    {
        UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Hello" message:@"Only alpha numeric characters are allowed" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];
        return;

    }

但这仅在某些时候有效

谢谢!!

【问题讨论】:

  • 如果章程不是字母数字,则在“shouldChangeCharactersInRange”方法中返回 NO。

标签: objective-c xcode uitextview nscharacterset


【解决方案1】:

您可以使用 [[[NSCharacterSet alphanumericCharacterSet] reverseSet] 来实现。此方法将返回一个字符集,其中仅包含接收者中不存在的字符。

NSCharacterSet *charactersToBlock = [[NSCharacterSet alphanumericCharacterSet] invertedSet];

//符合UITextField委托并实现该方法。

 - (BOOL)textField:(UITextField *)field shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)characters
 {
    return ([characters rangeOfCharacterFromSet:charactersToBlock].location == NSNotFound);
 }

【讨论】:

    【解决方案2】:

    试试这个:

        - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
                if (textField == txtWebsite) {
                        NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 "];
    
                        if ([string rangeOfCharacterFromSet:set].location != NSNotFound) {
                            return YES;
                        }
                        else {
                            return NO;
                        }
                }
                else {
                        return YES;
                }
        }
    

    在 uitextfield 的委托方法中编写代码。

    【讨论】:

      【解决方案3】:

      为 textview 设置委托并覆盖/实施测试应该在范围方法中更改

      - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 
      {
           NSCharacterSet *alphaSet = [NSCharacterSet alphanumericCharacterSet];
           BOOL valid = [[text stringByTrimmingCharactersInSet:alphaSet] isEqualToString:@""];
           return valid;    
      }
      

      【讨论】:

        【解决方案4】:

        @user1113101 提供的答案的等效 Swift 3 版本

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

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

        func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
            /// 1. replacementText is NOT empty means we are entering text or pasting text: perform the logic
            /// 2. replacementText is empty means we are deleting text: return true
            if text.characters.count > 0 {
                var allowedCharacters = CharacterSet.alphanumerics
        
                let unwantedStr = text.trimmingCharacters(in: allowedCharacters)
                return unwantedStr.characters.count == 0
            }
        
            return true
        }
        

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

        【讨论】:

          【解决方案5】:

          // 在 ViewDidLoad 或任何 init 方法中添加这个 NSCharacterSet *blockedCharacters = [[[NSCharacterSet alphanumericCharacterSet] reverseSet] 保留];

          然后在 nib 文件中设置文本字段的委托。

          - (BOOL)textField:(UITextField *)field shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)characters
          {
              return ([characters rangeOfCharacterFromSet:blockedCharacters].location == NSNotFound);
          }
          

          或者shouldChangeCharactersInRange 方法中还有另一种方法。你可以检查

          {
              NSString *stringPlace = @"[a-z  A-Z]*";
          
              NSPredicate *testPlace = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", stringPlace]; 
                  BOOL matches = [testPlace evaluateWithObject:string];
          
                  if (!matches && string.length > 5)
                  {
                      return NO;
                  }
              return YES;
          }
          

          【讨论】:

            猜你喜欢
            • 2011-11-24
            • 1970-01-01
            • 1970-01-01
            • 2014-04-11
            • 1970-01-01
            • 2017-11-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多