Objective-C循环比较密码

时间:2016-01-25 23:07:31

标签: ios objective-c passwords uialertcontroller

我正在尝试扩展我的一个iOS项目,要求用户输入密码然后重新输入密码,如果密码不匹配,请继续操作直到他们这样做。我可以通过在我的项目中设置IBOutlets然后进行比较来实现,但是如果它们不匹配,我该如何循环比较呢?我已经为此搜索了很多但是没有找到一个简单的答案,而不是一个名为PTPasscodeController的github项目,这对我想做的事情来说太复杂了,即简单的输入和比较,而不是广泛的安全。

我试图通过UIAlertController使其工作,但似乎无法初始化,然后检查循环以比较两个文本字段。也就是说,我知道如何通过UIAlertController获取一系列文本字段,但不知道如何在两个文本字段不匹配时保持警报。

如果有代码可以实现这一目标,或者更好的方式,我会很感激帮助!

2 个答案:

答案 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;
}