0

このような別のクラスのメソッド内でメソッドを呼び出すと、問題に直面しています

-(IBAction)login:(id)sender
{
    DBHelper *objdb = [[DBHelper alloc] init];
    [objdb loginnow:textname.text andpassword:textpassword.text]; 
}

DBhelper.mファイルでこのメソッドを呼び出すこのボタンメソッドと、このメソッドの呼び出しに成功しました

-(void) loginnow:(NSString *) username andpassword:(NSString *) password
{
    [self createEditableCopyOfDatabaseIfNeeded];
    [self initializeDatabase];
    const char *sql;

    NSString *querySQL = [NSString stringWithFormat: @"SELECT username, password FROM CONTACT WHERE username='%@' AND password='%@'",username,password]; 
    sql = [querySQL UTF8String];

    if (sqlite3_prepare_v2(database, sql, -1, &init_statement, NULL) != SQLITE_OK) {
        NSAssert1(0, @"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(database));
    }


    while (sqlite3_step(init_statement) == SQLITE_ROW) 
    {
        NSLog(@"char sql = %s" ,sql);


        dbusername = [NSString stringWithUTF8String:(char *)sqlite3_column_text(init_statement,0)];
        dbpassword = [NSString stringWithUTF8String:(char *)sqlite3_column_text(init_statement,1)];


    }
    if ([dbusername isEqualToString:username] && [dbpassword isEqualToString:password])
    {
        //DBHelper.callingViewController = self;

        [self.callingViewController addview]; 
    }

    else if (dbusername != username ||  dbpassword != password)
    {

        NSLog(@"dbusername is = %@" ,dbusername);
        NSLog(@"dbpassword is = %@" ,dbpassword);
        UIAlertView *alert = [[UIAlertView alloc]
                              initWithTitle:@"Login Failed"
                              message:@"Username Or Password is not Correct"
                              delegate:nil
                              cancelButtonTitle:nil
                              otherButtonTitles:@"OK ", nil];
        [alert show];
        [alert release];
    }
    sqlite3_reset(init_statement);
    [self closeDatabase];

}

また、DBhelper.hiでこれのプロパティを定義します

@property (strong) ViewController * callingViewController;

パスワードとユーザー名が正常に一致する場合、lognowメソッドのif条件内で、Viewcontroller.comファイルでこのmathodを呼び出していますが、//ViewController.mを呼び出すことができません

-(無効) addview {

DBHelper *f = [[DBHelper alloc] init];
f.callingViewController = self;

newview.center = CGPointMake(1000, 1000);

}

4

1 に答える 1

0

viewController を DBhelper に保持するのは賢明ではありませんが (MVC が壊れます)、ViewController のメソッドをコードとして呼び出すことができますが、ViewController を DBhelper に渡すように設定することを忘れないでください。多分このように:

//ViewController.m
-(IBAction)login:(id)sender
{
    DBHelper *objdb = [[DBHelper alloc] init];
    [objdb loginnow:textname.text andpassword:textpassword.text viewController:self]; 
}

//DBHelper.m
-(void) loginnow:(NSString *) username andpassword:(NSString *)password viewController:(ViewController *)vc
{ ...

    if ([dbusername isEqualToString:username] && [dbpassword isEqualToString:password])
    {
        [vc addview]; 
    }
  ...
}

しかし実際には、ここでデリゲート (またはブロックまたは通知ですが、ほとんどの場合デリゲート) を使用する必要があります。このような:

DBHelper.h で、@interface の前に追加

@class DBHelper;
@protocol DBHelperDelegate <NSObject>
-(void) DBHelp:(DBHelper *)helper didFinishedLoginSuc:(BOOL)suc;
@end

@interface と @end タグの間に、(ARC を使用していないと仮定して) @property (nonatomic, assign) id delegate; を追加します。

DBHelper.m の @implementation に追加します (自動合成を使用していないと仮定します)。

@synthesize delegate = _delegate;

これで、[self.callingViewController addview]; を変更できます。に

if (self.delegate && [self.delegate responseToSelector:@selector(DBHelp:didFinishedLoginSuc:)]) {
    [self.delegate DBHelp:self didFinishedLoginSuc:YES];
}

これで、DBHelperDelegate に従うすべてのビュー コントローラーに対して準備されたデリゲートを取得できます。ViewController.h で、クラス宣言の後ろに追加して、DBHelperDelegate に従うことをコンパイラに伝えます。

@interface ViewController:UIViewController<DBHelperDelegate>

addView メソッド名を次のように変更します。

-(void) DBHelp:(DBHelper *)helper didFinishedLoginSuc:(BOOL)suc

最後に、ボタンをクリックしたら、self を objdb のデリゲートとして設定します。

-(IBAction)login:(id)sender
{
    DBHelper *objdb = [[DBHelper alloc] init];
    objdb.delegate = self;
    [objdb loginnow:textname.text andpassword:textpassword.text]; 
}

これで、ログインに成功すると、ViewController.m の -(void) DBHelp:(DBHelper *)helper didFinishedLoginSuc:(BOOL)suc が呼び出され、ビューを処理できるようになります。

viewController が dealloc を取得したときにデリゲートを nil に設定することを忘れないでください。そうしないと、メモリ エラーが発生することが予想されます。気をつけて。

于 2012-12-06T08:46:34.163 に答える