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()