3

我在从 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 编程非常陌生,这让我很困惑。我真的希望有人能帮助我。

4

1 回答 1

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");
}

登录服务

//You are missing this part
-(void)login{

    if([self.delegate respondsToSelector:@selector(loginResult:)]){
        [self.delegate loginResult:YOUR_RESULT_DICTIONARY]
    }

}

解释

就像您将消息转发到设置了委托方法的类一样,因为发生了一些操作,在您的情况下,您正在从处理所有登录/api 连接的 LoginService 类登录,登录后您想要向您已设置委托方法的 ViewController 发送消息,并且我确保您设置委托的位置包含该方法,不会发生崩溃..

我希望它有所帮助。

于 2013-11-08T16:40:20.720 回答