当点击另一个 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 包含 inputViewinputAccessoryView 属性来解决这种情况:

inputView

如果此属性中的值为nil,则文本字段在成为第一响应者时显示标准系统键盘。将自定义视图分配给此属性会导致显示该视图。

【讨论】:

我该如何为我的案例实施这个? 将您的UIPickerViews 分配给它们对应的UITextFields 的inputView 属性(我认为是self.driverself.vehicle),然后让操作系统显示和像键盘一样隐藏它们。【参考方案5】:

如果包含文本字段的视图控制器显示为 modalViewController 并带有 formsheet 样式,那么您必须重写以下给定的方法以使其正常工作。

- (BOOL)disablesAutomaticKeyboardDismissal 

   return NO;

【讨论】:

以上是关于当点击另一个 UITextField 时键盘不会关闭,这会带来一个选择器的主要内容,如果未能解决你的问题,请参考以下文章

点击另一个 UITextField 后自动禁用键盘

Swift:无法让 UITextField 关闭键盘

当用户在 UITextField 之外点击时关闭键盘 [重复]

当点击 UITextField 时,加载 nib 文件以充当自定义键盘

IQKeyboardManager 在 UITextField 上点击时隐藏键盘

检测 UITextField 的焦点变化