在UIAlertController中,ios Keyboard不能自动显示UITextField

时间:2017-09-22 03:16:05

标签: ios objective-c keyboard uialertcontroller

我正在尝试使用文本字段显示UIAlertController。当它启动时,keyfoard会自动显示为文本字段,自动获得焦点。如何在没有键盘的情况下显示带有文本字段的警报(只有在用户点击文本字段时才会显示)。

这是我的代码

UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Collect Input"    message:@"input message"
    preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"Submit" style:UIAlertActionStyleDefault
    handler:^(UIAlertAction * action) {
        //use alert.textFields[0].text
    }];
    UIAlertAction* cancelAction = [UIAlertAction actionWithTitle:@"Cancel" handler:^(UIAlertAction * action) {
    //cancel action
    }];
    [alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
         // A block for configuring the text field prior to displaying the alert
         //[textField resignFirstResponder];

    }];
    [alert addAction:defaultAction];
    [alert addAction:cancelAction];
    [self presentViewController:alert animated:NO completion:nil];

1 个答案:

答案 0 :(得分:0)

有一些解决方案。

  1. 您可以在addTextFieldWithConfigurationHandler回调中获取对文本字段的引用,并将其存储在本地变量中。然后在presentViewController的完成处理程序中,您可以在文本字段上调用resignFirstResponder。但是这个解决方案远非理想,因为键盘会出现,然后立即被解雇。

  2. 更好的是设置文本字段delegate并实施shouldBeginEditing委托方法。添加实例变量以充当标志。第一次调用shouldBeginEditing时,不会设置标志,设置它并返回NO。然后每次检查标志并返回YES

  3. 这里是选项2的实现:

    表明您的类符合.m文件中的UITextFieldDelegate协议:

    @interface YourClassHere () <UITextFieldDelegate>
    @end
    

    为标志添加实例变量:

    BOOL showKeyboard = NO;
    

    更新您的提醒设置代码以设置文本字段的委托:

    [alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
        textField.delegate = self;
    }];
    

    实施文本字段委托方法:

    - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
        if (showKeyboard) {
            return YES;
        } else {
            showKeyboard = YES;
            return NO;
        }
    }
    

    这可以防止键盘的初始显示,但在此之后的任何时候都可以使用。