Как проверить / сравнить значение в текстовом поле с цепочкой для ключей для процесса входа в систему?

Я создаю многопользовательское приложение для iPhone и пытаюсь завершить кодирование для входящего в систему пользователя. Я могу успешно создать учетную запись и сохранить данные, введенные пользователем, в базу данных Core Data, а пин-код - в связку ключей, поэтому сейчас я пытаюсь завершить процесс входа в систему. Следующий код, приведенный ниже - это то, что у меня есть, я получаю сообщение об ошибке. Нет видимого @interface для "Аккаунта", объявляет селектор "пароль":

- (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.");
}
}

Файлы классов учетной записи m и h выглядят следующим образом:

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

Буду признателен за любые идеи или мысли, и спасибо за чтение.

3 ответа

Решение

Я смог проверить / подтвердить пин-код с помощью следующего кода.

// 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");

Это не вызов метода, объявленного в интерфейсе Account.h. А также [pinAccount password:_textFieldPin.text]; вызывает функцию, имеющую то же имя, что и свойство Account, т.е. получатель свойства.

Ум мелкая опечатка? Использование:

[pinAccount setPassword:_textFieldPin.text];

вместо:

[pinAccount password:_textFieldPin.text];

? Или я могу что-то упустить...

[Обновить]

  • Вы вызываете селектор с именем (NSString *) пароль.
  • Ваше сообщение об ошибке говорит о том, что селектор не отображается в интерфейсе. (Я понял, что вы сделали опечатку и на самом деле имели в виду "setPassword".)

Вместо этого я думаю, что ошибка в том, что в вашем файле.h селектор пароля (NSString *) не определен в интерфейсе, поэтому он не виден никакому внешнему коду.

т.е. вы добавили бы эту строку в ваш файл.h:

- (NSString *)password;

(Я бы, вероятно, переименовал селектор из пароля в нечто иное, чтобы его не спутали со свойством.)

Другие вопросы по тегам