chr*_*roy 3 delegates objective-c ios
我在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
Run Code Online (Sandbox Code Playgroud)
在LoginService.m中实现:
-(void)loginResult:(NSDictionary*)loginData{
NSLog(@"%@",loginData);
}
Run Code Online (Sandbox Code Playgroud)
现在我的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];
}
Run Code Online (Sandbox Code Playgroud)
首先,我尝试将标签的文本设置为登录结果,但由于我失败了,我有这个代码只是为了看看是否在ViewController.m中调用了LoginService委托方法:
- (void)loginResult:(NSDictionary *)loginData{
NSLog(@"reached");
}
Run Code Online (Sandbox Code Playgroud)
这可能是一个非常基本的问题,但我对iOS编程非常陌生,这让我感到很困惑.我真的希望有人可以帮助我.
我觉得你错过了什么.你的声明是完美的,但你的电话是不正确的.它应该如下..
视图控制器
- (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");
}
Run Code Online (Sandbox Code Playgroud)
login服务
//You are missing this part
-(void)login{
if([self.delegate respondsToSelector:@selector(loginResult:)]){
[self.delegate loginResult:YOUR_RESULT_DICTIONARY]
}
}
Run Code Online (Sandbox Code Playgroud)
说明
它就像你将消息转发到你设置了委托方法的类,因为某些动作已经发生,在你的情况下,你是从LoginService类登录,它处理你所有的登录/ api连接,登录后你想要将消息发送到您已设置委托方法的ViewController,并且我确保您设置委托的位置包含该方法以避免崩溃.
我希望它有所帮助.
| 归档时间: |
|
| 查看次数: |
7529 次 |
| 最近记录: |