委托方法没有解雇?

时间:2014-05-20 07:39:26

标签: ios objective-c delegates

就在我认为自己能够了解代表的工作方式时,我似乎错过了一些东西。

我设置了一个像这样的代表:

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

2 个答案:

答案 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

之前进行模态展示