【问题标题】:Dismiss keyboard when tapping on an UITextField with custom inputView使用自定义 inputView 点击 UITextField 时关闭键盘
【发布时间】:2015-07-03 05:02:40
【问题描述】:

我有三个 UITextFields

UITextField1

UITextField2

UITextField3

编辑完 textField2 后,我点击键盘上的“下一步”,它隐藏了键盘,但没有显示选择器。

如果我完成了 textField2 的编辑并且没有关闭键盘并点击 textField3,则键盘不会隐藏并且选择器显示在键盘上方,那么除非我返回到 textField2 并在任何 textField 之外点击,否则无法关闭键盘。

sn-p:

- (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;
        }
    }
}

【问题讨论】:

    标签: ios objective-c keyboard uitextfield


    【解决方案1】:

    您需要将ActionSheetDatePicker 初始化代码移动到viewWillAppearviewDidLoad,以便在用户对文本字段进行操作之前对其进行初始化。你需要这个,所以textField3.inputView 在用户输入字段之前已经被分配了。现在您可以删除代码行[self.textField3 resignFirstResponder];,因为您的文本字段不会显示键盘,因为它的inputView 已经分配给ActionSheetDatePicker

    【讨论】:

    • 没用。一直显示键盘而不是选择器
    • 您可以编辑您的问题以显示修改后的代码吗?
    • 这可能是ActionSheetDatePicker 的问题作为测试,将其替换为标准UIDatePicker 并查看它的工作情况。如果是这样,您就会知道问题出在ActionSheetDatePicker
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这可能与这里的代码sn-p有关

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

      在这种情况下我认为你应该删除

      [Utils animateScreenUpByHalfKeyboardHeight:self.view];
      

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

      【讨论】:

      • 不,那行无关。屏幕动画是正确的,问题是选择器在键盘上方,因为键盘没有关闭。
      • 是的,我不太清楚你所说的选择器是什么意思,我的错。你试过其他两个答案了吗?
      【解决方案4】:

      您不需要每次在演出前都配置选择器。 将此代码移至 viewDid load 或 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;
      }
      

      【讨论】:

        猜你喜欢
        • 2011-06-30
        • 2016-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-08
        相关资源
        最近更新 更多