我正在尝试使用文本字段显示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];
答案 0 :(得分:0)
有一些解决方案。
您可以在addTextFieldWithConfigurationHandler
回调中获取对文本字段的引用,并将其存储在本地变量中。然后在presentViewController
的完成处理程序中,您可以在文本字段上调用resignFirstResponder
。但是这个解决方案远非理想,因为键盘会出现,然后立即被解雇。
更好的是设置文本字段delegate
并实施shouldBeginEditing
委托方法。添加实例变量以充当标志。第一次调用shouldBeginEditing
时,不会设置标志,设置它并返回NO
。然后每次检查标志并返回YES
。
这里是选项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;
}
}
这可以防止键盘的初始显示,但在此之后的任何时候都可以使用。