当点击具有自定义 inputView 的 UITextField 时,如何关闭键盘

3
我有三个UITextField
UITextField1 <- 显示键盘
UITextField2 <- 显示键盘
UITextField3 <- 显示自定义inputView(pickerView)
当完成编辑textField2时,我点击键盘上的“下一个”,它会隐藏键盘,但选择器没有显示。
如果我完成编辑textField2并且不关闭键盘,然后点击textField3,键盘不会隐藏,并且选择器会显示在键盘上方,除非我返回到textField2并在任何textField外面点击,否则无法关闭键盘。
片段:
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}


-(void) textFieldDidBeginEditing:(UITextField *)textField
{
    if(textField == self.textField3){
        // Close the keyboard.

        [self.textField3 resignFirstResponder];

        [self.view endEditing:YES];

        ActionSheetDatePicker *picker;

        NSString *fechaIni = [self.dates objectAtIndex:0];
        NSString *fechaFin = [self.dates objectAtIndex:[self.dates count]-1];

        NSDate *fechaMarcada;

        if(self.fecha == nil){
            fechaMarcada = [self fromDateString:fechaIni format:@"yyyyMMdd"];
        }else{
            fechaMarcada = self.fecha;
        }

        picker = [[ActionSheetDatePicker alloc] initWithTitle:@"Seleccione" datePickerMode:UIDatePickerModeDate selectedDate:fechaMarcada target:self action:@selector(datePickerValueChanged:) origin:textField cancelAction:nil];

        [picker setMinimumDate:[self fromDateString:fechaIni format:@"yyyyMMdd"]];
        [picker setMaximumDate:[self fromDateString:fechaFin format:@"yyyyMMdd"]];

        [picker setDoneButton:[[UIBarButtonItem alloc] initWithTitle:@"Ok" style:UIBarButtonItemStylePlain target:nil action:nil]];
        [picker setCancelButton:[[UIBarButtonItem alloc] initWithTitle:@"Cancelar" style:UIBarButtonItemStylePlain target:nil action:nil]];
        [picker showActionSheetPicker];

        self.textField3.inputView = picker.pickerView;
        self.textField3.text = [Utils formatDate:[self formatDate:fechaMarcada]];

        [Utils animateScreenUpByHalfKeyboardHeight:self.view];

    }else if(textField == self.textField1){
        if([self.currency.code isEqualToString:@"USD"]){
            textField.keyboardType = UIKeyboardTypeDecimalPad;
        }else{
            textField.keyboardType = UIKeyboardTypeNumberPad;
        }
    }
}

在textField3显示pickerView之前,如何在所有情况下关闭键盘?根据rmp的建议进行编辑。
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    [Utils navigationBarTitleAndSubtitle:self title:@"Title" subtitle:@"Subtitle"];

    NSString *fechaIni = [self.dates objectAtIndex:0];
    NSString *fechaFin = [self.dates objectAtIndex:[self.dates count]-1];

    NSDate *fechaMarcada;

    if(self.fecha == nil){
       fechaMarcada = [self fromDateString:fechaIni format:@"yyyyMMdd"];
    }else{
       fechaMarcada = self.fecha;
    }

   self.picker = [[ActionSheetDatePicker alloc] initWithTitle:@"Seleccione" datePickerMode:UIDatePickerModeDate selectedDate:fechaMarcada target:self action:@selector(datePickerValueChanged:) origin:self.textField3 cancelAction:nil];

   [self.picker setMinimumDate:[self fromDateString:fechaIni format:@"yyyyMMdd"]];
   [self.picker setMaximumDate:[self fromDateString:fechaFin format:@"yyyyMMdd"]];

   [self.picker setDoneButton:[[UIBarButtonItem alloc] initWithTitle:@"Ok" style:UIBarButtonItemStylePlain target:nil action:nil]];
   [self.picker setCancelButton:[[UIBarButtonItem alloc] initWithTitle:@"Cancelar" style:UIBarButtonItemStylePlain target:nil action:nil]];
   //[self.picker showActionSheetPicker];

   self.textField3.inputView = self.picker.pickerView;
   self.textField3.text = [Utils formatDate:[self formatDate:fechaMarcada]];
}

-(void) textFieldDidBeginEditing:(UITextField *)textField
{
    if(textField == self.textField3){
        // Close the keyboard.
        // [self.view endEditing:YES];

        [Utils animateScreenUpByHalfKeyboardHeight:self.view];

    }else if(textField == self.textField1){
        if([self.currency.code isEqualToString:@"USD"]){
            textField.keyboardType = UIKeyboardTypeDecimalPad;
        }else{
            textField.keyboardType = UIKeyboardTypeNumberPad;
        }
    }
}
4个回答

1
在您的类中添加手势识别器,可以像这样操作。确保将此UIGestureRecognizerDelegate添加到您的类顶部。
override func viewDidLoad() {
    let tap1 = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
    self. UITextField1!.addGestureRecognizer(tap1)
    tap1.delegate = self
}

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

func dismissKeyboard() {
    self.view.endEditing(true)
}

0

每次显示之前都不需要配置选择器。 将此代码移动到viewDidLoad或viewWillAppear中。

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    picker = [[ActionSheetDatePicker alloc] initWithTitle:@"Seleccione" datePickerMode:UIDatePickerModeDate selectedDate:fechaMarcada target:self action:@selector(datePickerValueChanged:) origin:textField cancelAction:nil];

        [picker setMinimumDate:[self fromDateString:fechaIni format:@"yyyyMMdd"]];
        [picker setMaximumDate:[self fromDateString:fechaFin format:@"yyyyMMdd"]];

        [picker setDoneButton:[[UIBarButtonItem alloc] initWithTitle:@"Ok" style:UIBarButtonItemStylePlain target:nil action:nil]];
        [picker setCancelButton:[[UIBarButtonItem alloc] initWithTitle:@"Cancelar" style:UIBarButtonItemStylePlain target:nil action:nil]];
        [picker showActionSheetPicker];

        self.textField3.inputView = picker.pickerView;
}

0

这可能与此代码片段有关

self.textField3.inputView = picker.pickerView;
        self.textField3.text = [Utils formatDate:[self formatDate:fechaMarcada]];

        [Utils animateScreenUpByHalfKeyboardHeight:self.view];

如果是这种情况,我认为你应该删除

[Utils animateScreenUpByHalfKeyboardHeight:self.view];

手势识别的答案可能是正确的


不,那一行代码没有任何关系。屏幕动画是正确的,问题在于选择器在键盘上方,因为键盘没有被关闭。 - spezzino
是的,我对你所说的“picker”并不完全清楚,我的错。你试过另外两个答案了吗? - Holmes

0
你需要将 ActionSheetDatePicker 的初始化代码移动到 viewWillAppear 或者 viewDidLoad 中,这样它就能在用户操作文本字段之前被初始化。你需要这样做是为了让 textField3.inputView 在用户进入该字段之前已经被分配。现在你可以删除代码行 [self.textField3 resignFirstResponder];,因为你的文本字段不会再弹出键盘,因为它的 inputView 已经被分配给了 ActionSheetDatePicker

无法正常工作。仍然显示键盘而非选择器。 - spezzino
你能否编辑你的问题以展示修改后的代码? - rmp
可能是ActionSheetDatePicker出了问题。作为一个测试,将其替换为标准的UIDatePicker并查看是否正常工作。如果是这样,你就会知道问题出在ActionSheetDatePicker上。 - rmp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接