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



当我在另一个类的方法中调用方法时,我遇到了问题,比如当有人点击按钮时,我有一个按钮的方法//在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 condition中,如果密码和用户名成功匹配,我将在Viewcontroller.com文件中调用此mathod,但未能调用//ViewController.m

-(void)addview{

DBHelper *f = [[DBHelper alloc] init];
f.callingViewController = self;
newview.center = CGPointMake(1000, 1000);

}

虽然将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)@属性(nonatomic,assign)id委托;

在DBHelper.m中的@实现中,添加(假设您没有使用自动合成)

@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 didFinishedLoginSc:(BOOL)suc,您可以处理您的视图。

请记住,当您的viewController被解除锁定时,请将委托设置为nil,否则会出现内存错误。小心。

最新更新