我在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中的Login按钮下的标签获取数据的值。这只是尝试我是否可以通过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编程很陌生,这让我感到很困惑。我真的希望有人可以帮助我。
答案 0 :(得分:8)
我觉得你错过了什么。你的声明是完美的,但你的电话是不正确的。它应该如下..
<强>的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");
}
<强> login服务强>
//You are missing this part
-(void)login{
if([self.delegate respondsToSelector:@selector(loginResult:)]){
[self.delegate loginResult:YOUR_RESULT_DICTIONARY]
}
}
<强>解释强>
就像你将消息转发到你已经设置了委托方法的类,因为某些动作已经发生,在你的情况下,你从LoginService类登录,它处理你所有的登录/ api连接,并在登录后你想发送消息给你已经设置了委托方法的ViewController,我确保你设置委托的地方包含那个没有崩溃的方法..
我希望它有所帮助。