Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 仅允许UITextField使用字母和数字_Ios_Iphone_Objective C_If Statement_Uitextfield - Fatal编程技术网

Ios 仅允许UITextField使用字母和数字

Ios 仅允许UITextField使用字母和数字,ios,iphone,objective-c,if-statement,uitextfield,Ios,Iphone,Objective C,If Statement,Uitextfield,我有一个注册视图控制器,用户需要在其中输入电子邮件地址、用户名和密码 对于用户名和密码字段,现在您可以使用用户名(如“user%$&”)和密码(如“password%^&$”)注册。我不希望人们能够使用这些特殊的字符 我想这样做,用户名和密码字段只能提交字母数字字符又名字母和数字。我已经找到了一些方法来实现这一点,但它们令人困惑,我需要这些方法来专门处理我的代码 以下是当用户输入电子邮件、用户名和密码并按下提交按钮时,我执行的一些代码: NSString *user = [_usernameEn

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

对于用户名和密码字段,现在您可以使用用户名(如“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 {
NSString*user=[\u usernameEntry text];
NSString*pass=[[u passwordEntry text];
NSString*email=[\u emailEntry text];
self.userSubmittedUsername=用户;
如果([用户长度]<4 | |[传递长度]<4){
UIAlertView*alert=[[UIAlertView alloc]initWithTitle:@“无效输入”消息:@“用户名和密码必须至少有4个字符长。”委托:自取消按钮提示:@“好”其他按钮提示:无];
[警报显示];
}else if([电子邮件长度]<8){
UIAlertView*alert=[[UIAlertView alloc]initWithTitle:@“无效条目”消息:@“请输入您的电子邮件地址”。代理:自我取消按钮:@“好”其他按钮:无];
[警报显示];
}否则{
我只想在上面的代码中添加另一个
else if
,如果有任何不是字母或数字的字符,它将显示一个警报视图


谢谢。

如果您确实想限制用户输入特殊字符,那么最好的方法可能是使用
shouldChangeCharactersRange:
方法

-(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;
}
-(BOOL)textField:(UITextField*)textField应更改字符范围:(NSRange)范围替换字符串:(NSString*)字符串
{
如果(textField==您的_用户名_textField | | textField==您的_密码_textField)
{
NSCharacterSet*myCharSet=[NSCharacterSet characterSetWithCharactersInString:@“0123456789ABCDefghijklmnopqrstuvxyzADefghijklmnopqrstuvxyz”];
对于(int i=0;i<[字符串长度];i++)
{
unichar c=[string characterAtIndex:i];
如果(![myCharSet成员:c])
{
返回否;
}
}
返回YES;
}
返回YES;
}
这将限制用户输入特殊字符。正如rmaddy指出的,在数据输入时进行这种验证总是很好的


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

一些更好的方法

好办法 更好的方法 注意,即使您可以通过在
.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;
}

如果有人最终在这里寻找用Swift实现这一点的快速方法,下面是我的解决方案(UITextField允许大写字母、小写字母、数字和空格)

如果没有空间,你可以简单地使用

let set = NSCharacterSet.alphanumericCharacterSet().invertedSet

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

虽然现在回答这个问题已经晚了,而且还有其他简单而有效的方法,但这个答案可能对某些人有用

这很简单,对我来说很有魅力

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

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

请不要将密码限制在这些有限的字符内。让用户输入安全的密码。为什么不在数据输入期间过滤无效字符在文本字段委托方法中输入无效字符
textField:shouldChangeCharactersRange:replacementString:
。rmaddy我刚听到一个“啊哈”感谢您的评论。我今天使用的一个应用程序的键盘上有@符号,但如果您点击它,它不会在UITextField中添加任何内容。这就是您在第二条评论中所说的吗?如果是,请在代码中发布您的解决方案,我将立即实现。谢谢!用户还允许复制粘贴inp吗使用此解决方案,您还可以组合集合或添加/删除字符。因此,您可以执行类似“var set=CharacterSet.alphanumerics set.insert(charactersIn:”)set.invert()的操作```
let set = NSCharacterSet.alphanumericCharacterSet().invertedSet
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
}