UITextField canBecomeFirstResponder 返回 NO

Posted

技术标签:

【中文标题】UITextField canBecomeFirstResponder 返回 NO【英文标题】:UITextField canBecomeFirstResponder returns NO 【发布时间】:2012-04-14 13:46:34 【问题描述】:

-(void)registerUser 方法中,我展示了一个带有 2 个 UITextField 和一个 Ok 按钮的模式视图。

填充 UITextFields 并按下 Ok 按钮后,我调用委托方法 -(void)AEMUserRegistrationVCUserName:(NSString *)un password:(NSString *)pw 验证连接到服务器的数据。

当答案到达-(void)request:(RKRequest *)request didLoadResponse:(RKResponse *)response 时,如果数据错误,我尝试使用self.userRegistrationVC.userName becomeFirstResponder] 将焦点设置在 UITextfield 上,但它没有获得焦点。

我检查了[self.userRegistrationVC.userName canBecomeFirstResponder],它返回 NO,另一方面,这是文档所说的默认返回。

我的代码在这里作为参考:

注意:

self.userNameselfPassword是NSStrings。 self.userRegistrationVC是一个 UIViewController。 self.userRegistrationVC.userNameself.userRegistrationVC.password是UITextfields。

-(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)registerUser -(void)AEMUserRegistrationVCUserName:(NSString *)un 密码:(NSString *)pw -(void)request:(RKRequest *)request didLoadResponse:(RKResponse *)response

阅读论坛,许多问题都以 [UITextField becomeFirstResponder] 作为解决方案来回答,所以我可能遗漏了一些重要的东西,我无法让它发挥作用。

文档说您可以覆盖 canBecomeFirstResponder 以返回 YES,但是如何覆盖 UITextField 方法?这是需要做的吗?

【问题讨论】:

【参考方案1】:

试试 UITextView。与iPhone: Stop UIScrollView from auto scrolling when UITextView text is changed打交道的痛苦可以成为你的果实。无论如何,它的作用恰恰相反……很烦人,但如果您通过委托回调限制输入,这可能是可行的

【讨论】:

以上是关于UITextField canBecomeFirstResponder 返回 NO的主要内容,如果未能解决你的问题,请参考以下文章

在 UITextField 操作中将 UITextField 字符串转换为 Double

如何调整 UITextField 占位符文本以适合 UITextField 宽度?

如果添加了新的 UITextField,如何向下移动许多 UITextField

如果 UITextField 已经创建,不要在 Tap 上重新创建 UITextField

使用未声明类型的 UITextfield

猫猫学iOS之UITextField右边设置图片,以及UITextField全解