2

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

编辑:

试过了,

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;

    }

但这仅适用于某些时候

谢谢!!

4

5 回答 5

13

您可以使用 [[[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);
 }
于 2013-04-22T12:30:00.173 回答
1

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

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 
{
     NSCharacterSet *alphaSet = [NSCharacterSet alphanumericCharacterSet];
     BOOL valid = [[text stringByTrimmingCharactersInSet:alphaSet] isEqualToString:@""];
     return valid;    
}
于 2013-04-22T12:31:53.680 回答
1

尝试这个:

    - (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 的委托方法中编写代码。

于 2013-04-22T12:28:09.390 回答
1

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

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

于 2017-09-06T19:37:08.037 回答
0

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

然后在 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;
}
于 2013-04-22T12:32:52.877 回答