UITextField canBecomeFirstResponder возвращает НЕТ

В методе -(void)registerUser я представляю модальное представление с двумя UITextFields и кнопкой Ok.

После заполнения UITextFields и нажатия кнопки «ОК» я вызываю метод делегата -(void)AEMUserRegistrationVCUserName:(NSString *)un password:(NSString *)pw, где я проверяю данные, подключающиеся к серверу.

Когда ответ приходит в -(void)request:(RKRequest *)request didLoadResponse:(RKResponse *)response. Если данные неверны, я пытаюсь установить фокус на поле UIText с помощью self.userRegistrationVC.userName becomeFirstResponder], но он не получает фокуса.

Я проверил [self.userRegistrationVC.userName canBecomeFirstResponder], и он возвращает НЕТ, что, с другой стороны, соответствует тому, что в документах говорится, что он возвращается по умолчанию.

Мой код здесь в качестве ссылки:

Примечание:

self.userNameи selfPasswordявляются строками NSString. self.userRegistrationVCявляется UIViewController. self.userRegistrationVC.userNameи self.userRegistrationVC.passwordявляются текстовыми полями пользовательского интерфейса.

-(void)registerUser
{
    //Recuperar el nombre de usuario
    self.userName = [[NSUserDefaults standardUserDefaults] objectForKey:kNombreUsuario];
    if (!self.userName) {
        //No hay nombre de usuario, el usuario nunca ha registrado la aplicación.
        if (!self.userRegistrationVC) {
            //Solicitar datos de registro
            self.userRegistrationVC = [[AEMUserRegistrationViewController alloc] initWithNibName:@"AEMUserRegistrationViewController" bundle:nil];
        }
        self.userRegistrationVC.delegate = self;
        [self.viewControllerToPresentModalView presentModalViewController:self.userRegistrationVC animated:YES];
        return;
    }


    //Recuperar la contraseña
    NSError *error;
    self.password = [SFHFKeychainUtils getPasswordForUsername:self.userName andServiceName:kServiceName error:&error];
    if (!self.password) {
        //No hay contraseña. La contraseña se ha perdido.
        if (!self.userRegistrationVC) {
            //Solicitar datos de registro
            self.userRegistrationVC = [[AEMUserRegistrationViewController alloc] initWithNibName:@"AEMUserRegistrationViewController" bundle:nil];
        }
        self.userRegistrationVC.delegate = self;
        [self.viewControllerToPresentModalView presentModalViewController:self.userRegistrationVC animated:YES];
        return;
    }

    //Los datos del usuario existen
    //Verificar el registro
    [self.client get:kConfirmUsuario
         queryParams:[NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:self.userName, self.password, nil] 
                                                 forKeys:[NSArray arrayWithObjects:kNombreUsuario, kPassword, nil]]
                                                delegate:self];
}

-(void)AEMUserRegistrationVCUserName:(NSString *)un password:(NSString *)pw
{
    //El usuario ha introducido datos de registro
    //Realizar el registro
    self.userName = un;
    self.password = pw;
    [self.client get:kCreateUsuario 
         queryParams:[NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:self.userName, self.password, nil]
                                                 forKeys:[NSArray arrayWithObjects:kNombreUsuario, kPassword, nil]]
            delegate:self];

    //No hacer dismiss ahora esperar a verificar el registro
}


-(void)request:(RKRequest *)request didLoadResponse:(RKResponse *)response
{
    //Puede responder a createUsuario o a confirmUsuario
    //En ambos casos el error impide registrar al usuario y ejecutar el programa
    BOOL isRequestCreateUser;
    NSRange aRange = [request.resourcePath rangeOfString:kCreateUsuario];
    if (aRange.location != NSNotFound) { 
        //The request was to create a user
        isRequestCreateUser = YES;
    } else {
        //The request was to check a user
        isRequestCreateUser = NO;
    }


    if (response.isConflict) {
        //Error
        [self.userRegistrationVC.userNameError setHidden:NO];
        if ([self.userRegistrationVC.password canResignFirstResponder]) {
            NSLog(@"SI"); //This return NO
        }
        if ([self.userRegistrationVC canBecomeFirstResponder]) {
            NSLog(@"SI"); //This returns NO           
        }
        [self.userRegistrationVC.userName becomeFirstResponder]; 
    }

    if (response.isServerError) {
        //Error
        [self.userRegistrationVC.userNameError setHidden:NO];
        [self.userRegistrationVC.userName becomeFirstResponder];                
    }



    if (response.isOK) {
        //Success

        //Retirar la pantalla de registro de usuario
        [self.viewControllerToPresentModalView dismissModalViewControllerAnimated:YES];

        //Si la peticion fue crear un usuario
        if (isRequestCreateUser) {
            //Guardar el nombre de usuario en las preferencias del usuario
            [[NSUserDefaults standardUserDefaults] setValue:self.userName forKey:kNombreUsuario];           
            //Guardar la contraseña en KeyChain
             [SFHFKeychainUtils storeUsername:self.userName andPassword:self.password forServiceName:kServiceName updateExisting:YES error:nil];
        }

        [self.delegate AEMUserRegistrationSucess];
    }    
}

Последовательность звонков будет такой:

  • -(void)РегистрацияПользователя
  • -(void)AEMUserRegistrationVCUserName:(NSString *)un пароль:(NSString *)pw
  • -(void)запрос:(RKRequest *)запрос сделалLoadResponse:(RKResponse *)ответ

Читая форум, на многие вопросы отвечает [UITextField beFirstResponder] в качестве решения, поэтому, возможно, я упускаю что-то важное и не могу заставить его работать.

В документах говорится, что вы можете переопределить canBecomeFirstResponder, чтобы он возвращал YES, но как я могу переопределить метод UITextField? Это то, что нужно сделать?


person David Casillas    schedule 14.04.2012    source источник


Ответы (1)


Попробуйте UITextView. Боль работы с iPhone: остановить UIScrollView из автоматическая прокрутка при изменении текста UITextView может стать вашим плодом. Он делает прямо противоположное, несмотря ни на что ... раздражает, но может быть жизнеспособным, если вы ограничиваете ввод с помощью обратных вызовов делегата.

person Stephen J    schedule 24.05.2012