如何在iphone中调用方法中的方法
当我在像这样的另一个类的方法中调用方法时,我遇到了一个问题,当有人单击按钮时,我有按钮的方法 //在ViewController.m按钮方法中如何在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文件中调用这个方法,它成功地
-(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];
}