我在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,并且我确保在已设置委托的位置包含该方法而不会崩溃。

希望对您有所帮助。

09-26 03:32