我在iOS应用程序中从Web服务获取数据时遇到问题。我有一个名为LoginService的NSObject类。当用户单击Login时,将从ViewController中调用LoginService的loginWithUsername方法。
在我的LoginService中,我创建了一个名为LoginServiceDelegate的委托。这是LoginService.h中的代码:
//Creating custom delegate
@protocol LoginServiceProtocol <NSObject>
-(void)loginResult:(NSDictionary*)loginData;
@end
@interface LoginService : NSObject<NSURLConnectionDataDelegate>{
NSMutableData* _responseData;
id<LoginServiceProtocol>_delegate;
}
@property(nonatomic,strong)id<LoginServiceProtocol>delegate;
//End of custom delegate creation
在LoginService.m中实现:
-(void)loginResult:(NSDictionary*)loginData{
NSLog(@"%@",loginData);
}
现在,我的LoginService也是NSURLConnection的委托。调用委托方法connectionDidFinishLoading后,使用JSON将获取的数据转换为NSDictionary,并传递给loginResult。对于LoginService来说,它工作正常,正在记录提取的数据。
现在我的问题是,例如,我试图将获取的数据的值设置为ViewController.m中“登录”按钮下的标签。这只是尝试是否可以通过LoginService委托成功获取数据。问题是,我不能。 ViewController已成为LoginService的委托。我在viewDidLoad方法和loginWithUserName方法中都尝试过,这是在按下登录按钮时调用的。
我在ViewController.m的viewDidLoad方法中有以下代码:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
LoginService *ls = [[LoginService alloc]init];
ls.delegate=self;
[ls loginResult];
}
首先,我尝试将标签的文本设置为登录结果,但是由于失败,我得到了这段代码,只是看看是否曾经在ViewController.m中调用过LoginService委托方法:
- (void)loginResult:(NSDictionary *)loginData{
NSLog(@"reached");
}
这可能是一个非常基本的问题,但是我对iOS编程还是很陌生,这让我很困惑。我真的希望有人能帮助我。
最佳答案
我认为您缺少某些东西。您的声明是完美的,但您的调用不正确。应该如下。
ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
LoginService *ls = [[LoginService alloc]init];
ls.delegate=self;
[ls login];
}
- (void)loginResult:(NSDictionary *)loginData{
NSLog(@"reached");
}
LoginService
//You are missing this part
-(void)login{
if([self.delegate respondsToSelector:@selector(loginResult:)]){
[self.delegate loginResult:YOUR_RESULT_DICTIONARY]
}
}
说明
就像您将消息转发到设置了委托方法的类一样,发生了某些动作,在这种情况下,您是从LoginService类登录的,该类处理所有的登录/ api连接,登录后要将消息发送到您已将其委托方法设置到的ViewController,并且我确保在已设置委托的位置包含该方法而不会崩溃。
希望对您有所帮助。