在方法-(void)registerUser
中,我用2个UITextFields和一个OK按钮呈现一个模态视图。UITextField canBecomeFirstResponder返回NO
填充UITextFields并按下确定按钮后,我调用代理方法-(void)AEMUserRegistrationVCUserName:(NSString *)un password:(NSString *)pw
,在此验证连接到服务器的数据。
当答案到达-(void)request:(RKRequest *)request didLoadResponse:(RKResponse *)response
如果数据是错误的我试着用self.userRegistrationVC.userName becomeFirstResponder]
设置焦点在UITextfield,但它没有得到焦点。
我检查了[self.userRegistrationVC.userName canBecomeFirstResponder]
,它返回NO,而另一方面是文档说默认返回的是NO。
我的代码是在这里作为参考:
注:
self.userName
和selfPassword
是NSString的。 self.userRegistrationVC
是一个UIViewController。 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];
}
}
调用的顺序将是:
- - (无效)registerUser
- - (空)AEMUserRegistrationVCUserName:(的NSString *)取消密码:(的NSString *)PW
- - (无效)请求:(RKRequest *)请求didLoadResponse:(RKResponse *)回应
阅读论坛很多问题都回答了[ UITextField becomeFirstResponder]作为一个解决方案,所以也许我错过了一些重要的东西,而且我不能让它工作。
该文档说,你可以重写canBecomeFirstResponder返回YES,但我怎么能重写一个UITextField方法?这是需要完成的吗?