0

このメソッド-(void)registerUserでは、2つのUITextFieldsと[OK]ボタンを備えたモーダルビューを表示します。

UITextFieldsに入力し、[OK]ボタンを押した後、デリゲートメソッドを呼び出して-(void)AEMUserRegistrationVCUserName:(NSString *)un password:(NSString *)pw、サーバーに接続しているデータを確認します。

答えが到着したとき-(void)request:(RKRequest *)request didLoadResponse:(RKResponse *)responseデータが間違っている場合は、UITextfieldにフォーカスを設定しようとしますself.userRegistrationVC.userName becomeFirstResponder]が、フォーカスが取得されません。

チェック[self.userRegistrationVC.userName canBecomeFirstResponder]したところ、NOが返されました。一方、ドキュメントでは、デフォルトで返されると言われています。

私のコードは参照としてここにあります:

ノート:

self.userNameおよびselfPasswordはNSStringです。 self.userRegistrationVCUIViewControllerです。 self.userRegistrationVC.userNameおよびself.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 password:(NSString *)pw
  • -(void)request:(RKRequest *)request didLoadResponse:(RKResponse *)response

フォーラムを読むと、解決策として[UITextFieldbecomeFirstResponder]で多くの質問に答えられるので、重要なものが欠けている可能性があり、それを機能させることができません。

ドキュメントには、canBecomeFirstResponderをオーバーライドしてYESを返すことができると書かれていますが、UITextFieldメソッドをオーバーライドするにはどうすればよいですか?これは何をする必要がありますか?

4

1 に答える 1

0

UITextView を試してください。iPhoneを扱う際の苦労: UITextView のテキストが変更されたときに UIScrollView の自動スクロールを停止すると、成果が得られる可能性があります。何があっても正反対のことをします...迷惑ですが、デリゲートコールバックを介して入力を制限すると実行可能になる可能性があります

于 2012-05-24T18:37:44.143 に答える