3

我有 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 的新手,正在寻找我能理解的解决方案。谢谢!

编辑这里是一张图片键盘卡住了

4

5 回答 5

0

请尝试使用这个

   - (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];
}
于 2013-04-19T13:46:04.823 回答
0

为了得到这样,你可以使用这个

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    [self showPickDriver];

    return NO;
}

或者

否则最好使用带有点击手势的标签,然后您可以轻松解决此问题。

于 2013-04-19T13:47:37.000 回答
0

您也可以尝试使用 textField 的属性:inputView

当文本字段成为第一响应者时显示的自定义输入视图。

因此,您可以显示此视图而不是键盘,并且不要手动处理它。

或者:

现在会出现错误行为,因为还显示了第二个文本字段的键盘。因此,您不仅需要辞去第一个字段的第一响应者,还需要实现:

-(BOOL) textFieldShouldBeginEditing:(UITextField *)field {
    return NO;
}
于 2013-04-19T13:52:38.013 回答
0

UITextField包括inputViewinputAccessoryView属性来解决这种情况:

inputView

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

于 2013-04-19T14:18:23.287 回答
0

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

- (BOOL)disablesAutomaticKeyboardDismissal 
{
   return NO;
}
于 2014-03-13T11:47:49.540 回答