就在我认为自己能够了解代表的工作方式时,我似乎错过了一些东西。
我设置了一个像这样的代表:
ViewControllerA.h
@protocol LoginDelegate <NSObject>
-(void)userLoginSuccessful;
@end
@interface BBLoginViewController : BBBaseViewController
@property (weak, nonatomic) id <LoginDelegate> delegate;
@end
ViewControllerA.m
-(void)someMethod
{
if ([self.delegate respondsToSelector:@selector(userLoginSuccessful)]){
[self.delegate userLoginSuccessful];
}
[self dismissViewControllerAnimated:YES completion:nil];
}
ViewControllerB.m
#import "ViewControllerA.h"
@interface ViewControllerB () <UITableViewDataSource, UITableViewDelegate, LoginDelegate>
-(void)viewWillAppear:(BOOL)animated
{
ViewControllerA *loginViewController = [[ViewControllerA alloc]init];
loginViewController.delegate = self;
}
#pragma mark - Login Delegate
-(void) userLoginSuccessful
{
NSLog (@"Delegate fired!");
}
毕竟这个我的委托方法不会触发。我究竟做错了什么?我看了this SO answer,当检查代表不是零时 - 事实并非如此。它设置为ViewControllerB
。
答案 0 :(得分:3)
此代码:
-(void)viewWillAppear:(BOOL)animated
{
ViewControllerA *loginViewController = [[ViewControllerA alloc]init];
loginViewController.delegate = self;
}
将创建一个ViewControllerA
对象,然后(几乎)立即销毁它,而不是你想要的。
您可能想要在prepareForSegue:
方法中设置委托......
答案 1 :(得分:2)
在展示delgate
之前设置ViewControllerB
。以下代码不再需要
-(void)viewWillAppear:(BOOL)animated
{
ViewControllerA *loginViewController = [[ViewControllerA alloc]init];
loginViewController.delegate = self;
}
不要这样做。它会给你意想不到的结果。请记住,在移动到下一个视图之前始终设置委托。如果您在presentViewController
之前使用segue在prepareForSegue