UITextField получает фокус, а затем сразу теряет фокус из-за возврата YES в textFieldShouldReturn

Вот мои коды:

- (void)viewDidLoad {
    [super viewDidLoad];

    // passwordTextField cannot get focus after click next key due to this RAC
    RAC(self.loginButton, enabled) = [RACSignal combineLatest:@[self.userTextField.rac_textSignal,
                                                                self.passwordTextField.rac_textSignal]
                                                       reduce:^id (NSString *user, NSString *password) {
                                                           if ([user length] > 0 && [password length] > 0) {
                                                               return @YES;
                                                           }
                                                           return @NO;
                                                       }];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    if (textField == self.userTextField) {
        [self.passwordTextField becomeFirstResponder];
    } else {
        [self loginAction:textField];
    }
    // passwordTextField cannot get focus after click next key due to returning YES
    return YES;
}

- (void)loginAction:(id)sender
{
    [self.userTextField resignFirstResponder];
    [self.passwordTextField resignFirstResponder];
    // some login actions
}

Я хочу, чтобы переместить фокус на passwordTextField, когда нажмите кнопку возврата в userTextField. Но passwordTextField получает фокус, а затем сразу теряет фокус. Я создал подкласс UITextField и попытаться найти причину. Я обнаружил, что если я верну ДА в функции textFieldShouldReturn, passwordTextField получит insertText вызов. Тогда пароль TextField получит resignFirstResponder позвони немедленно. Я не знаю, почему мы должны вернуть NO в функции textFieldShouldReturn сейчас. Кто-нибудь может мне помочь?

========

Добавить дополнительную информацию:

Я обнаружил, что эта проблема появится только когда я использую ReactiveCocoa. Версия ReactiveCocoa - 2.5.

2 ответа

Просто установите тег для вашего текстового поля и введите этот код

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    NSInteger nextTag = textField.tag + 1;
    // Try to find next responder
    UIResponder* nextResponder = [textField.superview viewWithTag:nextTag];
    if (textField.tag == 0) {
        // Found next responder, so set it.
        [nextResponder becomeFirstResponder];
    } else {
        // Not found, so remove keyboard.
        [textField resignFirstResponder];
    }
    return NO;
}

Я надеюсь, что это поможет вам здорово.

Если вам нравится мой ответ, примите и подтвердите мой ответ

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
   NSUInteger index = textField.tag;
   if (index == 1 || textField == self.passwordTextField) 
   { 
      [textField resignFirstResponder];
   }
   else
   {
      [textField becomeFirstResponder];
   }
   return NO;
}
Другие вопросы по тегам