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

Posted

技术标签:

【中文标题】iOS 中未调用自定义委托方法【英文标题】:Custom Delegate Method Not Called in iOS 【发布时间】:2013-11-08 16:32:34 【问题描述】:

我在从 ios 应用程序中的 Web 服务获取数据时遇到问题。我有一个名为 LoginService 的 NSObject 类。当用户点击登录时,从 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 编程非常陌生,这让我很困惑。我真的希望有人可以帮助我。

【问题讨论】:

嘿@Rob。我对你的术语不太熟悉哈哈。对不起,这里的新手,但我会学习的,保证。无论如何,如果您的意思是如果我正在从网站调用或获取数据,则已经进行了网络交互,我只是省略了这一点,因为这不是我的问题所在。我会检查你的其他观察结果,我会更新我的程序。谢谢。 如果您想讨论这些不相关的观察,我们应该将其移至聊天:chat.***.com/rooms/40842/… 顺便说一句,声明委托属性的推荐方法是弱或分配,而不是强(以避免保留循环)。例如,请参阅***.com/questions/7753841/…。 您使用 (nonatomic, strong) 设置您的委托。您应该始终将其声明为弱,否则它将保存在其上注册的对象,并且您将遇到保留周期问题 【参考方案1】:

我认为你遗漏了一些东西。你的声明是完美的,但你的电话是不正确的。应该如下..

视图控制器

- (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 发送消息,并且我确保您设置委托的位置包含该方法,不会发生崩溃..

希望对你有帮助。

【讨论】:

天哪。你是一个救生员。超级感谢。我有一个问题,为什么我需要那段代码? 完美!谢谢你。我现在意识到这与 Java 和 android 有什么关系

以上是关于iOS 中未调用自定义委托方法的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionReusableView 中未调用委托

自定义 UITextField 委托方法 shouldChangeCharactersIn 没有被调用

在我的自定义 collectionView 布局中未调用 prepare()

Swift:在自定义视图中未调用 UIButton 触摸事件

使用自定义 TS 装饰器的组件方法中未定义角服务

facebook iOS sdk 自定义委托和 SSO 授权