如何在iphone中调用方法中的方法

如何在iphone中调用方法中的方法,iphone,objective-c,Iphone,Objective C,当我在像这样的另一个类的方法中调用方法时,我遇到了一个问题,当有人单击按钮时,我有按钮的方法 //在ViewController.m按钮方法中 -(IBAction)login:(id)sender { DBHelper *objdb = [[DBHelper alloc] init]; [objdb loginnow:textname.text andpassword:textpassword.text]; } 这个按钮方法在DBhelper.m文件中调用这个方法,它成功地

当我在像这样的另一个类的方法中调用方法时,我遇到了一个问题,当有人单击按钮时,我有按钮的方法 //在ViewController.m按钮方法中

-(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.h中,我定义了这个属性

@property (strong) ViewController * callingViewController;
在lognow方法中的if条件中,如果密码和用户名成功匹配,我将调用Viewcontroller.com文件中的此方法,但调用失败 //ViewController.m

-(无效)添加视图 {


}

尽管在DBhelper中保留viewController是不明智的(它会破坏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
现在,您可以更改[self.callingViewController addview];到

if (self.delegate && [self.delegate responseToSelector:@selector(DBHelp:didFinishedLoginSuc:)]) {
    [self.delegate DBHelp:self didFinishedLoginSuc:YES];
}
现在,为每个服从DBHelperDelegate的视图控制器准备了一个委托。 在ViewController.h中,通过在类declare后面添加命令,告诉编译器它遵守DBHelperDelegate:

@interface ViewController:UIViewController<DBHelperDelegate>
最后,当您单击该按钮时,将self设置为objdb的委托

-(IBAction)login:(id)sender
{
    DBHelper *objdb = [[DBHelper alloc] init];
    objdb.delegate = self;
    [objdb loginnow:textname.text andpassword:textpassword.text]; 
}
现在,当您成功登录时,-(void)DBHelp:(DBHelper*)helper didFinishedLoginSuc:(BOOL)suc in ViewController.m将被调用,您可以处理视图


记住,当viewController获得dealloc时,请将委托设置为nil,否则会出现内存错误。小心。

在DBhelper中调用ViewController的位置是什么?并且不建议在模型中保持视图控制器。也许你应该试试这里的委托模式。此外,我猜不出您想在viewController的addview方法中执行什么操作。如果你能提供你想做的事情,我想我可以建议一个解决方案。我只想更改uiview的内容,使其消失实际上newview是一个uiviewhey在添加时出错删除错误是找不到“DbHelperDelegate”的协议请添加
#导入“DBHelper.h”
在ViewController.hi中导入此#导入“DBHelper.h”,但仍然出现此错误无法找到“DBHelperDelegate”的协议如果在DBHelper.h中正确添加协议,则不应是错误。请检查是否有打字错误,否则您可能会将其放在错误的位置。
@interface ViewController:UIViewController<DBHelperDelegate>
-(void) DBHelp:(DBHelper *)helper didFinishedLoginSuc:(BOOL)suc
-(IBAction)login:(id)sender
{
    DBHelper *objdb = [[DBHelper alloc] init];
    objdb.delegate = self;
    [objdb loginnow:textname.text andpassword:textpassword.text]; 
}