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

时间:2013-11-08 16:32:34

标签: ios objective-c delegates

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

1 个答案:

答案 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,我确保你设置委托的地方包含那个没有崩溃的方法..

我希望它有所帮助。