Hoe een waarde in een tekstveld vergelijken/vergelijken met een sleutelhanger voor een inlogproces?

Ik maak een iPhone-app voor meerdere gebruikers en probeer de codering voor het inlogproces voor de gebruiker af te ronden. Ik kan met succes een account maken en de gegevens die de gebruiker invoert in de Core Data DB en de pin in de Keychain opslaan, dus nu probeer ik het inlogproces te voltooien. De volgende onderstaande code is wat ik tot nu toe heb, ik krijg een foutmelding, Geen zichtbare @interface voor 'Account' verklaart het wachtwoord van de selector: '

- (IBAction)processLogin:(id)sender {

// hide keyboard
[_textFieldUsername resignFirstResponder];
[_textFieldPin resignFirstResponder];


// First - make activity indicator visible, then start animating, then turn of wrong user/pin label
_welcomeActivityIndicator.hidden = FALSE;
[_welcomeActivityIndicator startAnimating];
[_wrongUserPin setHidden:YES];

// check if username and pin text fields are populated
if ([_textFieldUsername.text length ] == 0 &&  [_textFieldPin.text length ] == 0)
{
    [_welcomeActivityIndicator stopAnimating];
    [_wrongUserPin setHidden:NO];   
}

// CORE DATA
// NSManagedObjectContext *context = _managedObjectContext;

NSFetchRequest *request= [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Account" inManagedObjectContext:_managedObjectContext];
NSPredicate *predicate =[NSPredicate predicateWithFormat:@"username=%@",self.textFieldUsername.text];

// TODO check pin
Account *pinAccount = [[Account alloc] init];

// GETTING ERROR ON BELOW LINE OF CODE! - ERR0R - No visible @interface for 'Account' declares the selector 'password:'
[pinAccount password:_textFieldPin.text];


[request setEntity:entity];
[request setPredicate:predicate];

NSError *error = nil;

NSArray *array = [_managedObjectContext executeFetchRequest:request error:&error];
if (array != nil) {
    NSUInteger count = [array count];//may be 0 if the object has been deleted.
    NSLog(@"Username may exist, %@",count);
}

else {
    NSLog(@"Username does not exist.");
}
}

De accountklasse-bestanden m en h zien er ongeveer als volgt uit:

Account.m

- (NSString*)password 
{
if (self.username)
    return [KeychainHelper getPasswordForKey:self.username];
return nil;
}

- (void)setPassword:(NSString*)aPassword 
{
if (self.username) [KeychainHelper setPassword:aPassword forKey:self.username];


}
- (void)prepareForDeletion
{
if (self.username) [KeychainHelper removePasswordForKey:self.username];
}
@end

Account.h

#import "AccountBase.h"

@interface Account : AccountBase {

}

// nonatomic - don't worry about multithreading

@property (nonatomic, assign) NSString *password;

- (void)setPassword:(NSString*)aPassword;

@end

Ik zou alle ideeën of gedachten waarderen, en bedankt voor het lezen.

0

3 antwoord

Ik kon de pin controleren/verifiëren met de volgende code.

// CORE DATA
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Account" inManagedObjectContext:_managedObjectContext];

// set entity for request
[request setEntity:entity];

// filter results using a predicate
NSPredicate *pred =[NSPredicate predicateWithFormat:(@"username = %@"), _textFieldUsername.text];

// set predicate for the request
[request setPredicate:pred];

NSError *error = nil;

// store DB usernames in results array
NSArray *results = [_managedObjectContext executeFetchRequest:request error:&error];

NSLog(@"The returned results are %@",results);


// check text field against results stored in DB
for (Account *anAccount in results) {
    if ([anAccount.username isEqualToString:_textFieldUsername.text]){
        NSLog(@"Your username exists");
        if ([anAccount.password isEqualToString:_textFieldPin.text]){
            NSLog(@"Your pin is correct");
0
toegevoegd
Het lijkt erop dat u referenties opslaat in een database. Ik weet niet zeker of dat veilig is. U moet waarschijnlijk de KeychainItemWrapper-voorbeeldcode van Apple eens bekijken. ( developer.apple.com/library/ios/#samplecode/GenericKeychain & zwnj;/& hellip; )
toegevoegd de auteur Anthony C, de bron

Umm minor typo? Gebruik:

[pinAccount setPassword: _textFieldPin.text];

in plaats van:

[pinAccount wachtwoord: _textFieldPin.text];

? Of misschien mis ik iets ...

[Update]

  • U belt een selector genaamd (NSString *) wachtwoord .
  • Uw foutmelding zegt dat de selector niet zichtbaar is in de interface. (Ik bedoel hiermee dat je een typfout hebt gemaakt en eigenlijk "setPassword" hebt bedoeld.)

In plaats daarvan denk ik dat de fout is dat in uw .h-bestand de (NSString *) wachtwoord selector niet is gedefinieerd in de interface en daarom niet zichtbaar is voor externe codes.

d.w.z. U zou deze regel toevoegen aan uw .h-bestand:

- (NSString *)password;

(Ik zou de selector waarschijnlijk van wachtwoord hernoemen naar iets anders, zodat het niet verward raakt met de eigenschap.)

0
toegevoegd
Ik probeer niet om het wachtwoord in te stellen, omdat ik dat doe wanneer het account wordt aangemaakt. Ik probeer het wachtwoord dat in het tekstveld is ingevoerd te vergelijken met het wachtwoord dat is opgeslagen in de sleutelhanger om het aanmeldingsproces te maken/voltooien.
toegevoegd de auteur Chris, de bron
Oh, ik begrijp wat je zegt. Op basis hiervan lijkt het erop dat u een selector genaamd (NSString *) wachtwoord heeft gedefinieerd in het .m-bestand, maar het wordt niet gedeclareerd in het .h-bestand. Dat zou ook uw foutmelding verklaren. Ik zal het antwoord bijwerken.
toegevoegd de auteur Anthony C, de bron

Het roept geen methode op die is gedeclareerd in de interface van Account.h. En [pinAccount wachtwoord: _textFieldPin.text]; roept een functiedeel dezelfde naam op met een eigenschap van een account, d.w.z. de getter van de eigenschap.

0
toegevoegd