self.delegate是nil,不会被调用

时间:2015-02-13 01:47:03

标签: ios delegates null

我最近一直在努力解决问题,相信如果解决方案在某个地方在线,我不会在这里发帖。 这是我的问题:

我有一个父VC,其中有3个childVC链接到它。我有三个委托代表向parentVC报告一些动作,即使我为3个使用声明了同样的东西,它也适用于其中2个而不是第3个。

这是我的代码: 在parentVC.m

// Initializing the clientsListViewController
self.clientsListViewController = [[UIStoryboard storyboardWithName:@"AGZClientsList" bundle:nil] instantiateInitialViewController];
[self addChildViewController:self.clientsListViewController];
[self.clientsListViewController didMoveToParentViewController:self];
self.clientsListViewController.delegate = self;

在我的孩子VC.h

@protocol AGZClientsListViewControllerDelegate <NSObject>

- (void)didClickLeftBarButtonInClientsView:(UIButton*)button;

@end

@interface AGZClientsListViewController : AGZBaseViewController

@property (nonatomic, weak) id <AGZClientsListViewControllerDelegate> delegate;

@end

在我的孩子VC.m

- (void)didClickLeftBarButton:(UIButton*)button
{
    if ([self.delegate respondsToSelector:@selector(didClickLeftBarButtonInClientsView:)])
        [self.delegate didClickLeftBarButtonInClientsView:button];
}

请帮助我!

2 个答案:

答案 0 :(得分:0)

parentVC被调用之前发布了delegate吗?您设置了委托weak,因此如果该对象是免费的,则会将其设置为nil

答案 1 :(得分:0)

可能是您的parentVC未正确符合您的childVC协议。当编译器遇到self.delegate时,它会尝试找到符合您协议的Controller类;基本上它是试图找到应该实现你在childVC类的@protocol ....@end部分内已经登记的方法的委托类。可能由于某种原因,它失败了。

让我们试试一下清单 -

  1. 您是否在ParentVC的协议列表中声明了自定义委托。在接口声明的parentVC.h类中执行

    @interface parentVC:UINavigationController

  2. PS:我认为你的parentVc是一个导航控制器。无论是导航控制器还是视图控制器都无关紧要。

    1. 如果有,请尝试移动

      self.clientsListViewController.delegate = self;

    2. 在实例化控制器之后,意味着在

      之后
      self.clientsListViewController = [[UIStoryboard storyboardWithName:@"AGZClientsList" bundle:nil] instantiateInitialViewController];
      
      1. 如果仍然不起作用,请在之后设置一个断点 self.clientsListViewController = [[UIStoryboard storyboardWithName:@"AGZClientsList" bundle:nil] instantiateInitialViewController]; 并尝试打印self.clientsListViewController以查看您是否拥有childVc的实例。如果它打印为nil则存在您的问题 - 您的parentVC没有您的childVc的正确实例,委托也是如此。
      2. 在这种情况下,请尝试正确实例化childVC。