0

マルチユーザーiPhoneアプリを作成していて、処理中のユーザーログインのコーディングを完了しようとしています。アカウントを正常に作成し、ユーザーが入力したデータをCore Data DBに保存し、ピンをキーチェーンに保存できるので、ログインプロセスを完了しようとしています。以下にリストされている次のコードは、私がこれまでに持っているものです。エラーが発生します。「アカウント」の@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.");
}
}

Accountクラスファイル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

アイデアや考えをいただければ幸いです。お読みいただきありがとうございます。

4

3 に答える 3

0

Account.h のインターフェイスで宣言されたメソッドを呼び出していません。また[pinAccount password:_textFieldPin.text];、アカウントのプロパティ、つまりプロパティのゲッターと同じ名前を共有する関数を呼び出しています。

于 2012-06-25T06:17:02.140 に答える
0

次のコードでピンを確認/検証できました。

// 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");
于 2012-06-28T02:28:19.903 に答える
0

うーん、マイナーなタイプミス?使用する:

[pinAccount setPassword:_textFieldPin.text];

それ以外の:

[pinAccount password:_textFieldPin.text];

? それとも、私は何かを見逃しているかもしれません...

[アップデート]

  • (NSString *)passwordというセレクターを呼び出しています。
  • あなたのエラーメッセージは、セレクターがインターフェイスに表示されていないことを示しています。(これは、タイプミスをしたという意味で、実際には「setPassword」を意味していると解釈しました。)

代わりに、.h ファイルで(NSString *)passwordセレクターがインターフェイスで定義されていないため、外部コードからは見えないことが間違いだと思います。

つまり、次の行を .h ファイルに追加します。

- (NSString *)password;

(おそらくセレクターの名前をpasswordから別のものに変更して、プロパティと混同しないようにします。)

于 2012-06-24T06:10:30.877 に答える