Подтвердить что ты не робот

Отказ от первого ответчика для нескольких UITextFields

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

4b9b3361

Ответ 1

Не вызывайте resignFirstResponder; вызов endEditing:!

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

Ответ 2

**[self.view endEditing:TRUE];** //Resign firstresponder for all textboxes on the view

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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

вы можете отменить currentTextField....

Ответ 5

Вы можете попробовать это следующим образом:

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

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

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

Я не пробовал, но кажется хорошим решением

Ответ 6

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

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

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

Ответ 7

Вы можете установить textFields в качестве свойств и синтезировать их. Вам потребуется столько свойств, сколько вы используете в своем приложении.

У вас может быть @synthesise myTextField0, myTextField1, myTextField2; для трех текстовых полей. Просто назначьте каждый UITextField, который вы используете для этих свойств, объявляя их.

И когда вы хотите уйти в отставку, просто используйте [self.myTextField0 resignFirstResponder] at textFieldDidEndEditing или какую-либо функцию, которую вы хотите отменить. И вы также можете использовать это для других текстовых полей. Это способ обработки нескольких текстовых полей

В общем, вы можете пропустить все эти шаги с помощью textField.returnKeyType = UIReturnKeyDone; , если у вас есть ключ возврата DONE, вы можете просто перейти к методу

 - (BOOL) textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return 1;
}

или вы можете использовать tags для пометки определенных текстовых полей, а затем отменить определенные.

Ответ 8

вы можете проверить с помощью isFirstResponder. В любой момент времени только один UIResponder (UITextField в вашем случае) может быть firstResonder.

Ответ 9

Кстати, я сделал это по-разному. Не выглядя достаточно хорошего программирования Champ tech, но достаточно, чтобы решить мою работу.

for(UIView *v in self.view.subviews)
    {
        if(([v isMemberOfClass:[UITextField class]]==YES) && !(CGRectContainsPoint(v.frame,[[touches anyObject] locationInView:self.View)))
           {
               v.userInteractionEnabled=NO;
               if([v isEditing])
               {
               [v resignFirstResponder];
               }
           }
    }

Ответ 10

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

Ответ 11

Это сработало для меня в 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.

Ответ 12

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

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

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

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

Ответ 13

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

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

[self.view EndEditing:YES]