【问题标题】:Delegate method not firing?委托方法没有触发?
【发布时间】:2014-05-20 07:39:26
【问题描述】:

就在我以为我已经了解了代表的工作方式时,我似乎遗漏了一些东西。

我已经像这样设置了一个委托:

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

【问题讨论】:

  • 检查您的委托方法。你已经定义了这个协议方法userLoginSuccessful并且你正在调用-(void)expanItemImage:(UITapGestureRecognizer *)tap
  • 而且您不需要检查您的委托是否响应协议选择器,因为您将其正确定义为符合 LoginDelegate 协议的类型。
  • 复制和粘贴错误 - 更新了问题。对不起各位。我删除了 IF 语句检查选择器是否响应委托并且它仍然没有被调用
  • 你是否到达线[self.delegate userLoginSuccessful]; ?
  • 我到达了 if 语句。永远不会执行。删除语句并调用 [self.delegate userLoginSuccessful];也不行。

标签: ios objective-c delegates


【解决方案1】:

这段代码:

-(void)viewWillAppear:(BOOL)animated
{

    ViewControllerA *loginViewController = [[ViewControllerA alloc]init];
    loginViewController.delegate = self;

}

将创建一个 ViewControllerA 对象,然后(几乎)立即销毁它,这不是您想要的。

无论如何,您可能希望在 prepareForSegue: 方法中设置委托...

【讨论】:

  • +1 - (几乎)立即销毁它,这不是您想要的。
  • ViewControllerB 以模态方式存在于 viewControllerA 之上。我没有使用 pprepareForSegue 方法。
  • @Tander 好吧,您的代码不是您创建和使用视图控制器的方式。
  • @Tander 尝试在呈现ViewControllerB之前设置委托
  • @Anil 什么时候是设置代理的最佳时间?
【解决方案2】:

在呈现ViewControllerB 之前设置delgate。下面的代码不再需要了

-(void)viewWillAppear:(BOOL)animated
  {
     ViewControllerA *loginViewController = [[ViewControllerA alloc]init];
     loginViewController.delegate = self;

  }

不要那样做。它会给你意想不到的结果。请记住在移动到下一个视图之前始终设置委托。如果您在presentViewController 之前以模态方式呈现,或者如果您在prepareForSegue 中使用segue

【讨论】:

  • “它会给你意想不到的结果”。 Errr,我认为结果可以准确预测。
  • @trojanfoe 大声笑:) 是的,完全正确.. 不是你想要的结果!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多