ios - 使用自定义 inputView 点击 UITextField 时关闭键盘

标签 ios objective-c keyboard uitextfield

我有三个 UITextField

UITextField1 <- 显示键盘

UITextField2 <- 显示键盘

UITextField3 <- 显示自定义输入 View (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;
        }
    }
}

最佳答案

像这样添加一个手势识别器。确保将这个 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)
}

关于ios - 使用自定义 inputView 点击 UITextField 时关闭键盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29850069/

相关文章:

iphone - release 与 nil —— 最佳实践

ios - webview 在 objective-c 中不起作用

windows - 以编程方式找出窗口的键盘快捷键

swift - 将操作分配给 UITextField 并更新 UILabel

ios - 编译器错误 - iOS "expected ")"before "问题

ios - 如何制作密码确认器 swift 3

ios - Firebase 性能 |控制台中没有数据出现

ios - UITableView 在 heightForRowAtIndexPath 和 cellForRowAtIndexPath 之间挂起 5 秒

objective-c - 基本的Objective-C类型转换问题

java - 为什么我的 KeyListener 不读取按键?