如何将UIAlertView输入限制为特定字符?

时间:2014-03-06 13:29:40

标签: ios objective-c

我有一个非常简单的UIAlertView,带有标题,文本字段和确定按钮。我想将文本字段中输入的内容限制为字母数字字符(0-9 a-z A-Z)。这就是我第一次制作警报视图的方式:

UIAlertView * alert = [[UIAlertView alloc] initWithTitle: @"Client id"
                                                 message: @"some title"
                                                delegate: self
                                       cancelButtonTitle: @"Ok"
                                       otherButtonTitles: nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[alert show];

我首先尝试寻找答案,似乎每个人都建议实施 - (BOOL)textField:(UITextField *)theTextField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
然后将textField添加到警报中,如下所示:

- (void)someInitialisationMethod {
    UIAlertView * alert = [[UIAlertView alloc] initWithTitle: @"Client id"
                                                     message: @"some title"
                                                    delegate: self
                                           cancelButtonTitle: @"Ok"
                                           otherButtonTitles: nil];
    UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(12.0, 45.0, 260.0, 25.0)];
    [alert addSubview:textField];
    [alert show];
}

- (BOOL)textField:(UITextField *)theTextField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    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;
}

我试过这个并将UITextFieldDelegateUIAlertViewDelegate添加到我的视图控制器中。我的问题是文本字段甚至没有添加到我的警报视图。我最后只有一个标题和一个确定按钮的警报。

如何将文本字段正确添加到警报中?我是否正确实施了其余的解决方案?我从this SO question's answer

中删除了shouldChangeCharactersInRange方法

1 个答案:

答案 0 :(得分:3)

你没有说你为什么放弃第一种方式,但这是要走的路。您无法向UIAlertView添加视图。总是不鼓励在警报中添加子视图,但是从iOS7开始就不可能。

所以坚持你的第一种方法。并且不要忘记设置嵌入式textField的委托:

UIAlertView * alert = [[UIAlertView alloc] initWithTitle: @"Client id"
                                                 message: @"some title"
                                                delegate: self
                                       cancelButtonTitle: @"Ok"
                                       otherButtonTitles: nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;

UITextField *textField = [alert textFieldAtIndex:0];
textField.delegate = self;

[alert show];