我正在尝试扩展我的一个iOS项目,要求用户输入密码然后重新输入密码,如果密码不匹配,请继续操作直到他们这样做。我可以通过在我的项目中设置IBOutlets然后进行比较来实现,但是如果它们不匹配,我该如何循环比较呢?我已经为此搜索了很多但是没有找到一个简单的答案,而不是一个名为PTPasscodeController
的github项目,这对我想做的事情来说太复杂了,即简单的输入和比较,而不是广泛的安全。
我试图通过UIAlertController
使其工作,但似乎无法初始化,然后检查循环以比较两个文本字段。也就是说,我知道如何通过UIAlertController
获取一系列文本字段,但不知道如何在两个文本字段不匹配时保持警报。
如果有代码可以实现这一目标,或者更好的方式,我会很感激帮助!
答案 0 :(得分:2)
如果它们不匹配,我该如何循环比较?
你根本不循环。在UI环境中,您可以通过禁用操作和显示错误来完成“再次询问”行为。
我假设除了“密码”和“重新输入密码”字段之外,您还有某种“我完成”按钮(例如“下一步”,“完成”等),这些按钮最初应该被禁用
您应该在文本字段协议中回复textField:shouldChangeCharactersInRange:replacementString:
,检查两个密码是否相等,并执行以下两项操作之一:
答案 1 :(得分:0)
这是我的代码有效。
我有两个视图控制器。第一个视图控制器是一个tableView控制器,用于检查设置包中所需的密码。如果需要密码,它会对第二个视图控制器执行segue。
第二个视图控制器将密码与重新输入的密码进行比较,并根据两者是否匹配来设置文本颜色。此外,如果先前设置了密码,它将从视图中删除第二个密码请求(通过检查故事板中的子视图标记),并将之前输入的密码与用户现在输入的密码进行比较。 不是很优雅,但它适用于我的目的。
第一个视图控制器的相关代码:
NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
NSLog(@"defaults %@", [defaults
dictionaryRepresentation]);
BOOL passwordProtect = [[defaults valueForKey:@"password"]boolValue];
if(passwordProtect)
{
self.passwordEntered = YES;
[self performSegueWithIdentifier:@"passcodeViewController" sender:self];
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if([segue.identifier isEqualToString:@"passcodeViewController"]){
NRCPasscodeControllerViewController *destViewController = segue.destinationViewController;
destViewController.password = self.password;
}
}
第二个视图控制器的代码:
@interface NRCPasscodeControllerViewController : UIViewController <UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UITextField *password1;
@property (weak, nonatomic) IBOutlet UITextField *password2;
@property (strong, nonatomic) NSString *password;
@property (nonatomic) BOOL passwordWasEntered;
@end
实施档案:
#import "NRCPasscodeControllerViewController.h"
@interface NRCPasscodeControllerViewController ()
@end
@implementation NRCPasscodeControllerViewController
- (IBAction)checkPasswords:(id)sender {
// if a password has not been entered, display
// both password fields
if((self.passwordWasEntered == NO)){
// password1 must be 4 characters in length
if ([self.password1.text length] == 4) {
self.password1.textColor = [UIColor greenColor];
} else {
self.password1.text =@"Invalid!";
self.password1.textColor = [UIColor redColor];
}
// password2 must be 4 characters in length
if ([self.password2.text length] == 4) {
self.password2.textColor = [UIColor greenColor];
} else {
self.password2.text =@"Invalid!";
self.password2.textColor = [UIColor redColor];
}
// passwords must match
if([self.password1.text isEqual:self.password2.text]){
self.password2.textColor = [UIColor greenColor];
// passwords match, so set the password and segue back
self.password = self.password1.text;
[self performSegueWithIdentifier:@"unwindToTableView" sender:self];
}
else{
self.password2.textColor = [UIColor redColor];
}
}
// if password has already been entered, just check the first password
// field against the entered password.
else if (self.password == self.password1.text){
// password matches entered password, so set the password and segue back
self.password1.textColor = [UIColor greenColor];
[self performSegueWithIdentifier:@"unwindToTableView" sender:self];
}
else{
// password does not match entered password
self.password1.textColor = [UIColor redColor];
self.password = self.password1.text;
}
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField{
[textField resignFirstResponder];
return YES;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.password1.delegate = self;
self.password2.delegate = self;
[self.navigationItem setHidesBackButton:YES animated:YES];
// Do any additional setup after loading the view from its nib.
}
-(void)viewWillAppear:(BOOL)animated{
// if self.password is not nil, a password has already been entered
// so only display one password field to check.
if(self.password){
[[self.view viewWithTag:3] removeFromSuperview];
[[self.view viewWithTag:2] removeFromSuperview];
self.passwordWasEntered = YES;
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
并在第一个接收展开segue的控制器中:
-(IBAction)unwindFromPasscodeController:(UIStoryboardSegue*)segue{
NSLog(@"Unwound from passcode controller");
NRCPasscodeControllerViewController *sourceViewController = segue.sourceViewController;
self.password = sourceViewController.password;
}