iOS中未调用自定义委派方法

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编程非常陌生,这让我感到很困惑.我真的希望有人可以帮助我.

iph*_*nic 8

我觉得你错过了什么.你的声明是完美的,但你的电话是不正确的.它应该如下..

视图控制器

- (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,并且我确保您设置委托的位置包含该方法以避免崩溃.

我希望它有所帮助.