iPhone: событие завершения редактирования UITextField не скрывает клавиатуру - PullRequest
3 голосов
/ 28 февраля 2012

Я хочу скрыть клавиатуру в UITextField конце события редактирования, но я не могу заставить работать следующий код! Когда я нажимаю кнопку «Готово», она скрывает клавиатуру, но не тогда, когда я не нажимаю кнопку «Готово» и перехожу на другую UITextField, где мне не нужна клавиатура, а UIPickerView. В основном UIPickerView появляется, но за клавиатурой. Я оставляю текущее значение UITextField в конце события редактирования, а также в начале редактирования необходимых текстовых полей. Код начала редактирования работает нормально, если у меня не отображена клавиатура для предыдущего UITextField. Может кто-нибудь сказать мне, что я делаю не так?

работает следующая последовательность:

  1. Выберите обычный UITextField и вставьте текст, нажмите кнопку «Готово» (это скрывает клавиатуру)
  2. Выбрать сборщик UITextField (отображает вид сборщика)

.. но следующее не делает:

  1. Выберите обычный UITextField и вставьте текст
  2. Выбор средства выбора UITextField (представление средства выбора находится за клавиатурой, поскольку я не нажимал кнопку «Готово» для предыдущего UITextField). Здесь он вызывает окончание редактирования, но не скрывает клавиатуру!

    - (BOOL)textFieldShouldReturn:(UITextField *)textField {
        [textField resignFirstResponder];
        scrollView.contentSize = CGSizeMake(320, 750);
        [scrollView setFrame:CGRectMake(0, 0, 320, 480)];
        return YES;
     }
    
    -(void)textFieldDidEndEditing:(UITextField *)textField  
    {
        [textField resignFirstResponder];
    }
    
    - (void)textFieldDidBeginEditing:(UITextField *)textField {
        DatePicker.hidden = YES;
        CountryPickerView.hidden = YES;
    
        switch (textField.tag) {
            case 3:
                [textField resignFirstResponder];
                DatePicker.hidden = NO;
                return;
            case 6:
                [textField resignFirstResponder];
                CountryPickerView.hidden = NO;
                return;
            default:
                break;
        }
        scrollView.contentSize = CGSizeMake(320, 650);
        [scrollView setFrame:CGRectMake(0, 0, 320, 260)];
    }
    

Ответы [ 7 ]

10 голосов
/ 28 февраля 2012

Вы должны полагаться не на теги, а на указатели на объекты и удалить [textField resignFirstResponder]; из textFieldDidEndEditing.

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 
    if (textField == theTextFieldIDontWantKeyboardFor) {  
        [thepreviousTextField resignFirstResponder]; 
        return NO;
    }
    return YES; 
}
7 голосов
/ 29 февраля 2012

скрывает клавиатуру, но не когда я не нажимаю кнопку «Готово» и не двигаюсь в другое поле uitextfield, где мне не нужна клавиатура, кроме PickerView.

Правильный способ справиться с этим - установить свойство inputView для поля, в котором вместо клавиатуры используется средство выбора. Сконфигурируйте сборщик так, как вам нужно (установите делегата, источник данных и т. Д.), А затем установите его в поле inputView. Система будет обрабатывать скрытие клавиатуры и показывать окно выбора, или наоборот, при переходе от одного поля к другому.

3 голосов
/ 28 февраля 2012

при переключении элемента управления из одного текстового поля в другое без отставки, textFieldDidBeginEditing не вызывается, поэтому вам нужно изменить текстовое поле, сделав его «firstResponder» (так как это не firstResponder из-за изменения в активном текстовом поле) затем позвонив resignFirstResponder

3 голосов
/ 28 февраля 2012
[yourTextField resignFirstResponder];

Это то, что на самом деле скрывает клавиатуру, поэтому используйте это, когда сборщик собирается открыть.

1 голос
/ 28 февраля 2012

Попробуйте этот код

 -(void)textFieldDidEndEditing:(UITextField *)textField  
  {
  if(textField==nameTextField){
    [nameTextField resignFirstResponder];

     //
  }
  else if(textField==pickerTextField){

  ///
  }
  }

  - (BOOL)textFieldShouldReturn:(UITextField *)textField {
  if(textField==nameTextField){
    [nameTextField resignFirstResponder];

    //
  }
  else if(textField==pickerTextField){

  ///
  }
  }
0 голосов
/ 03 мая 2014
-(void)hidekeybord
{
    [_txt_fname resignFirstResponder];
    [_txt_lname resignFirstResponder];
    [_txt_email resignFirstResponder];
    [_txt_phoneN resignFirstResponder];
    [_txt_dateofbd resignFirstResponder];
    [_txt_address resignFirstResponder];
    [_txt_city resignFirstResponder];

}

- (IBAction)btn_open_datepiker:(id)sender
{
    [self hidekeybord];

    _datepiker_bd.hidden=FALSE;
    _toolbar_db.hidden=FALSE;


}
0 голосов
/ 29 февраля 2012

Добавление сюда моих окончательных результатов!

Решение от Valexa.Это работало абсолютно нормально, но мне нужно было обрабатывать различные виды ввода вручную.

    - (BOOL)textFieldShouldReturn:(UITextField *)textField {
        [textField resignFirstResponder];
            scrollView.contentSize = CGSizeMake(320, 750);
            [scrollView setFrame:CGRectMake(0, 0, 320, 480)];
        return YES;
    }

    - (void)textFieldDidBeginEditing:(UITextField *)textField {    
           previousTextField = textField;
           scrollView.contentSize = CGSizeMake(320, 650);
           [scrollView setFrame:CGRectMake(0, 0, 320, 260)];
    }

    - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
           if (textField == CountryTextField || textField == BirthdayTextField) {
                  [previousTextField resignFirstResponder]; 
                  return NO; 
           }
          return YES; 
    }

Удивительное решение (спасибо Caleb): нет необходимости отслеживать дополнительные переменные для предыдущего текстового поля и не нужно иметь головную боль при показе и добавлении.просмотров

BirthdayTextField.inputView = DatePickerView;
CountryTextField.inputView = CountryPickerView;
SexTextField.inputView = SexPickerView;

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
    scrollView.contentSize = CGSizeMake(320, 750);
    [scrollView setFrame:CGRectMake(0, 0, 320, 480)];
return YES;
}

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    scrollView.contentSize = CGSizeMake(320, 650);
    [scrollView setFrame:CGRectMake(0, 0, 320, 260)];
}
...