2012-12-06 31 views
0

我面临的问题,当我另一个类的方法中调用方法,这样我有按钮的方法,当有人按钮 点击//内ViewController.m按钮方法如何调用一个方法的方法内iphone

-(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; 

和内如果condidtion在lognow方法,如果用户名和密码是succesully符合我打电话这马托在Viewcontroller.com文件,但我无法调用 //ViewController.m

- (空)addview {

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

newview.center = CGPointMake(1000, 1000); 

}

+0

你在哪里设置了在DBhelper中调用ViewController?不建议在模型中放置视图控制器。也许你应该在这里尝试委托模式。另外,我无法猜测你想在viewController的addview方法中做什么。如果你能提供你想要做的事情,我想我可以提出一个解决方案。 – onevcat

+0

我只是想改变它应该消失的uiview的内容实际上newview是一个uiview –

回答

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) @属性(非原子,分配)id委托;

在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 

最后,当你点击按钮,设置自我为objdb的委托

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

现在,当你登录成功, - (空)DBHelp:(DBHelper *)辅助didFinishedLoginSuc:在VI(BOOL)SUC ewController.m将被调用,您可以处理您的视图。

记得在你的viewController获取dealloc时将代理设置为nil,否则会发生内存错误。小心。

+0

嘿,当添加删除时出错错误没有找到'DBHelperDDelegate'的协议 –

+0

请加 '#import“DBHelper。 h“' 在ViewController.h – onevcat

+0

我导入这个#import”DBHelper.h“,但仍然得到这个错误无法找到协议'DBHelperDelegate' –

相关问题