2012-12-06 33 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' –

相關問題