Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS中未调用自定义委托方法_Ios_Objective C_Delegates - Fatal编程技术网

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

iOS中未调用自定义委托方法,ios,objective-c,delegates,Ios,Objective C,Delegates,我在iOS应用程序中从web服务获取数据时遇到问题。我有一个名为LoginService的NSObject类。当用户单击Login时,将从ViewController调用LoginService的loginWithUsername方法 在我的LoginService中,我创建了一个名为LoginServiceDelegate的委托。以下是LoginService.h中的代码: //Creating custom delegate @protocol LoginServiceProtocol &l

我在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 
现在,我的登录服务也是NSURLConnection的一个委托。调用委托方法ConnectionDiFinishLoading后,获取的数据将使用JSON转换为NSDictionary并传递给loginResult。对于LoginService,它工作正常,获取的数据正在被记录

现在我的问题是,我试图设置,例如,从ViewController.m获取的数据的值到我的登录按钮下的标签。这只是为了尝试是否可以通过LoginService委托成功获取数据。问题是,我不能。ViewController已成为LoginService的委托。我在viewDidLoad方法和loginWithUserName方法中都尝试过,这是按下login按钮时调用的方法

我在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];

}
- (void)loginResult:(NSDictionary *)loginData{
    NSLog(@"reached");
}
起初,我尝试将标签的文本设置为登录结果,但由于失败,因此我使用此代码只是为了查看是否在ViewController中调用了LoginService委托方法。m:

- (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];

}
- (void)loginResult:(NSDictionary *)loginData{
    NSLog(@"reached");
}

这可能是一个非常基本的问题,但我对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");
}
登录服务

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

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

}
解释

这就像您正在将消息转发到设置了委托方法的类,因为发生了某些操作,在您的情况下,您是从LoginService类登录的,该类处理所有登录/api连接,登录后,您希望将消息发送到设置了委托方法的ViewController,我保证在您设置委托的位置包含该方法,不会发生崩溃


希望能有帮助。

噢,天哪。你是个救生员。非常感谢。我有个问题,为什么我需要那段代码?太好了!非常感谢。我现在意识到这与Java和AndroidHey@Rob的关系。我不太熟悉你的术语哈哈。对不起,这里的新手,但我会学习的,保证。无论如何,如果你是说如果我打电话或从网站获取数据,那么网络交互已经完成,我只是省略了这一点,因为这不是我的问题所在。我会检查你的其他观察结果,并更新我的程序。谢谢。如果您想讨论这些不相关的观察结果,我们应该将其转移到聊天室:顺便说一句,声明委托属性的推荐方法是弱或赋值,而不是强(以避免保留循环)。请参见示例。您使用(非原子,强)设置代理。您应该始终将其声明为弱,否则它将保留在其上注册的对象,并且您将在保留周期中遇到问题