Отставка первого ответчика для нескольких полей UITextFields - PullRequest
13 голосов
/ 14 июля 2011

Есть приложение, в котором я генерирую несколько UITextFields динамически.Я хочу уволить первого респондента всякий раз, когда UITextFields не выбран (коснитесь за пределами UITextField).Как я могу узнать, что UITextField я должен уйти в отставку первого ответчика?Пожалуйста, укажите любой другой способ, кроме понятия «тег», потому что я пробовал это.Пожалуйста, предложите правильное направление.Заранее спасибо.

Ответы [ 13 ]

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

Не звоните resignFirstResponder; звоните endEditing:!

Вызовите endEditing: в любом представлении над текстовыми полями в иерархии представлений. Он найдет первого респондента и попросит его подать в отставку. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Понимание того, должен ли делегат текстового поля решить, следует ли ему прекратить редактирование, используйте endEditing:YES.

8 голосов
/ 13 сентября 2012
**[self.view endEditing:TRUE];** //Resign firstresponder for all textboxes on the view
3 голосов
/ 01 сентября 2011

Вы можете попробовать это так:

- (void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event { 

    for (id textField in self.view.subviews) {

        if ([textField isKindOfClass:[UITextField class]] && [textField isFirstResponder]) {
            [textField resignFirstResponder];
        }
    }
} 

Я не пробовал, но, похоже, хорошее решение

3 голосов
/ 14 июля 2011

Вы можете реализовать метод делегата

- (void)textFieldDidBeginEditing:(UITextField *)textField; 

, в котором вы можете взять currentTextField = textField;

в другом методе делегата

- (BOOL)textFieldShouldReturn:(UITextField *)textField; 

вы можете сделать currentTextField =nil;

затем вы можете подать в отставку currentTextField ....

3 голосов
/ 14 июля 2011

используйте этот код и реализуйте

-(BOOL)textFieldShouldReturn:(UITextField*)textField;
{
  NSInteger nextTag = textField.tag + 1;
  // Try to find next responder
  UIResponder* nextResponder = [textField.superview viewWithTag:nextTag];
  if (nextResponder) {
    // Found next responder, so set it.
    [nextResponder becomeFirstResponder];
  } else {
    // Not found, so remove keyboard.
    [textField resignFirstResponder];
  }
  return NO; // We do not want UITextField to insert line-breaks.
}
1 голос
/ 03 июля 2015

Самый общий способ, а также единственный, который работал для меня в UITableViewController, - отправка действия по цепочке респондента и ожидание правильного объекта для получения действия:

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];

Протестировано в iOS8

0 голосов
/ 06 октября 2017

У меня была проблема в Отставка первого респондента для выбранного UITextField из нескольких TextField. Я обнаружил, что работает для меня после стольких различных решений.

- (void)textFieldDidBeginEditing:(UITextField *)textField
{

    for (id textField in self.view.subviews) {

        if ([textField isKindOfClass:[UITextField class]] && [textField isFirstResponder] && [textField isEqual:_selectedLabel] ) {
            [textField resignFirstResponder];
        }
    }
}
0 голосов
/ 16 февраля 2016

Это сработало для меня в Xamarin.iOS / Monotouch.Измените кнопку клавиатуры на Далее, передайте элемент управления следующему UITextField и скройте клавиатуру после последнего UITextField.

private void SetShouldReturnDelegates(IEnumerable<UIView> subViewsToScout )
{
  foreach (var item in subViewsToScout.Where(item => item.GetType() == typeof (UITextField)))
  {
    (item as UITextField).ReturnKeyType = UIReturnKeyType.Next;
    (item as UITextField).ShouldReturn += (textField) =>
    {
        nint nextTag = textField.Tag + 1;
        var nextResponder = textField.Superview.ViewWithTag(nextTag);
        if (null != nextResponder)
            nextResponder.BecomeFirstResponder();
        else
            textField.Superview.EndEditing(true); 
            //You could also use textField.ResignFirstResponder(); but the above line makes some users happier (e.g. benzado)

        return false; // We do not want UITextField to insert line-breaks.
    };
  }
}

Внутри ViewDidLoad у вас будет:

Если у ваших TextFields нет тега, установите его сейчас:

txtField1.Tag = 0;
txtField2.Tag = 1;
txtField3.Tag = 2;
//...

и просто вызов

SetShouldReturnDelegates(yourViewWithTxtFields.Subviews.ToList());
//If you are not sure of which view contains your fields you can also call it in a safer way:
SetShouldReturnDelegates(txtField1.Superview.Subviews.ToList());
//You can also reuse the same method with different containerViews in case your UITextField are under different views.
0 голосов
/ 13 мая 2015

Использование [self.view endEditing:YES]; для resignFirstResponder для текущего активного UITextField.

0 голосов
/ 28 сентября 2013

Вы можете использовать endEditing вместо resignFirstResponder

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

[self.view EndEditing:YES]
...