当点击另一个 UITextField 时键盘不会关闭,这会带来一个选择器
Posted
技术标签:
【中文标题】当点击另一个 UITextField 时键盘不会关闭,这会带来一个选择器【英文标题】:Keyboard not dismissing when another UITextField is tapped that brings up a picker 【发布时间】:2013-04-19 13:41:06 【问题描述】:我有 2 个文本字段,我正在使用每个文本字段,单击它们会打开一个带有顶部工具栏的选择器轮盘,可以选择关闭选择器并调出键盘,除非您关闭选择器并带上,否则一切正常向上键盘,然后单击下一个文本字段。我把键盘放在上面,后面有新的pickerview。让键盘消失的唯一方法是在第一个文本字段中单击返回,然后单击完成或屏幕上的任何位置(不是文本字段)。
这是我的代码:
- (void)textFieldDidBeginEditing:(UITextField *)textField
for (NSUInteger i = 0; i<[self.fieldsArray count]; i++)
if ([self.fieldsArray objectAtIndex:i] == textField)
UITextField *input = [self.fieldsArray objectAtIndex:i];
if (input.tag == 3 && !self.overrideDriver)
[self animatePickDriverForInput:input];
if (input.tag == 4 && !self.overrideVehicle)
[self animatePickVehicleForInput:input];
以下是使用的其他一些方法:
- (IBAction)textFieldFinished:(id)sender
[sender resignFirstResponder];
- (BOOL)textFieldShouldReturn:(UITextField *)textField
[textField resignFirstResponder];
return YES;
- (void)animatePickDriverForInput:(UITextField *)input
if ([self.drivers count] > 0)
[self.view endEditing:YES];
[self showPickDriver];
else
//untested
[input addTarget:self action:@selector(textFieldFinished:)
forControlEvents:UIControlEventEditingDidEndOnExit];
- (void)animatePickVehicleForInput:(UITextField *)input
if ([self.vehicles count] > 0)
[self.view endEditing:YES];
[self showPickVehicle];
else
//untested
[input addTarget:self action:@selector(textFieldFinished:)
forControlEvents:UIControlEventEditingDidEndOnExit];
- (void)allowManualEntryOfDriver
[self.additionalButtonPickerHelper animateDismiss:self.pickDriver];
self.overrideDriver = YES;
[self.driver becomeFirstResponder];
- (void)allowManualEntryOfVehicle
[self.additionalButtonPickerHelper animateDismiss:self.pickVehicle];
self.overrideVehicle = YES;
[self.vehicle becomeFirstResponder];
- (void)showPickVehicle
self.pickVehicle = [self.additionalButtonPickerHelper createPicker:self.pickVehicle WithTag:2 WithOtherButtonText:@"Add Other Vehicle"];
[self.additionalButtonPickerHelper showPicker:self.pickVehicle WithDoneAction:@selector(dismissVehiclePicker) OrWithOtherAction:@selector(allowManualEntryOfVehicle)];
- (void)showPickDriver
self.pickDriver = [self.additionalButtonPickerHelper createPicker:self.pickDriver WithTag:1 WithOtherButtonText:@"Add Other Driver"];
[self.additionalButtonPickerHelper showPicker:self.pickDriver WithDoneAction:@selector(dismissDriverPicker) OrWithOtherAction:@selector(allowManualEntryOfDriver)];
编辑:
更多代码:
- (void)dismissDriverPicker
[self.additionalButtonPickerHelper animateDismiss:self.pickDriver];
- (void)dismissVehiclePicker
[self.additionalButtonPickerHelper animateDismiss:self.pickVehicle];
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
[self.view endEditing:YES];
这可能不是最有效的方法,但我是目标 c 的新手,正在寻找我能理解的解决方案。谢谢!
编辑这里是图片
【问题讨论】:
重新检查每个文本字段的代表 在你的情况下不需要显示键盘吧? 当您打开选择器时,只需将 [textField resignFirstResponder] 设置为所有文本字段.. 我亲爱的 frnd 发生了什么事。你得到答案了吗? @BluGeni:在打开选择器之前,您是否尝试过两个文本字段的 [textField resignFirstResponder]? 【参考方案1】:您也可以尝试使用 textField 的属性:inputView
当文本字段成为第一个时显示的自定义输入视图 响应者。
因此,您可以显示此视图而不是键盘,并且不要手动处理它。
或者:
现在出现错误行为,因为第二个文本字段的键盘也显示了。因此,您不仅需要辞去第一个字段的第一响应者,还需要实施:
-(BOOL) textFieldShouldBeginEditing:(UITextField *)field
return NO;
【讨论】:
在我的情况下如何使用输入视图? In viewDidLoad:像以前一样创建和配置您的pickerView,并分配'secondTextField.inputView = pickerView;'之后将出现您的 pickerView 而不是键盘。所以你不需要手动处理它出现【参考方案2】:为了得到这样的你可以使用这个
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
[self showPickDriver];
return NO;
或
否则最好使用带有点击手势的标签,然后您可以轻松解决此问题。
【讨论】:
@BluGeni:使用带有手势的标签。【参考方案3】:请尝试使用这个
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
[self showPickerView];
return NO;
- (void)showPickerView
// ----- here create your picker view --------
您可以使用第二种方法,但这不是正确的方法...所以我说更喜欢第一种方法。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
[self.view endEditing:YES];
【讨论】:
当我尝试第一种方法时,当我单击文本字段时,现在什么也没有发生。第二种方法没有效果 我得到了解决方案。如果视图控制器显示为具有表单样式的 modalViewController,这些代码将不起作用..【参考方案4】:UITextField
包含 inputView
和 inputAccessoryView
属性来解决这种情况:
inputView
如果此属性中的值为
nil
,则文本字段在成为第一响应者时显示标准系统键盘。将自定义视图分配给此属性会导致显示该视图。
【讨论】:
我该如何为我的案例实施这个? 将您的UIPickerView
s 分配给它们对应的UITextField
s 的inputView
属性(我认为是self.driver
和self.vehicle
),然后让操作系统显示和像键盘一样隐藏它们。【参考方案5】:
如果包含文本字段的视图控制器显示为 modalViewController 并带有 formsheet 样式,那么您必须重写以下给定的方法以使其正常工作。
- (BOOL)disablesAutomaticKeyboardDismissal
return NO;
【讨论】:
以上是关于当点击另一个 UITextField 时键盘不会关闭,这会带来一个选择器的主要内容,如果未能解决你的问题,请参考以下文章
当用户在 UITextField 之外点击时关闭键盘 [重复]
当点击 UITextField 时,加载 nib 文件以充当自定义键盘