【问题标题】:unable to set delegate and call method无法设置委托和调用方法
【发布时间】:2013-08-28 07:51:27
【问题描述】:

我创建了一个委托,在关闭当前视图控制器后将数据传回前一个视图控制器。

这就是我设置委托的方式

PaymentViewController.m

-(IBAction)techProcessAction:(id)sender
{
TechProcessPaymentVC *techVC = [[TechProcessPaymentVC alloc]init];
[techVC setTechDelegate:self];
 NSLog(@"DELEGATE == %@",techVC.techDelegate);

[self performSegueWithIdentifier:@"techProcess" sender:nil];
}

我可以看到委托已设置

Snap2Door[1765:1c703] DELEGATE == <PaymentDetailViewController: 0x9d3a360>

但是当我在TechProcessPaymentVCviewDidLoad 中查看它时,我得到了DELEGATE == (null)

我想这就是我的回调方法没有被调用的原因,它位于PaymentViewController.m

这就是我在 TechProcessPaymentVC.h 中定义委托的方式

@protocol techProcessDelegate <NSObject>
-(void) techProcessViewControllerDismissed:(NSString *)paymentStatus;
@end

@interface TechProcessPaymentVC : UIViewController<UIWebViewDelegate>
{
id techDelegate;
}
@property (nonatomic, assign) id<techProcessDelegate>    techDelegate;

这就是我试图调用PaymentViewController.m中存在的方法的方式

if ([[substrings objectAtIndex:0] isEqualToString:@"failure"]) {
        [self.techDelegate techProcessViewControllerDismissed:@"failure"];
        [self dismissViewControllerAnimated:YES completion:nil];
    }

【问题讨论】:

  • 你合成了你的委托属性了吗?
  • 是的,虽然我认为这没有必要,因为 XCode 会自动这样做

标签: iphone ios delegates storyboard


【解决方案1】:

你的问题是你从来没有任何事情techVC。您分配它,分配它的委托,然后让它超出范围(它将在 ARC 中被释放或泄漏)。

尝试以下操作:首先,从techProcessAction: 中删除实例化和赋值。其次,实现prepareForSegue:sender:,然后将self指定为segue的destinationViewControllertechDelegate。您的方法将类似于以下“代码”(我从内存中键入但没有尝试编译):

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"techProcess"]) {
        ((TechProcessPaymentVC *)segue.destinationViewController).techDelegate = self;
    }
}

-(IBAction)techProcessAction:(id)sender
{
    [self performSegueWithIdentifier:@"techProcess" sender:nil];
}

【讨论】:

    【解决方案2】:

    viewDidLoadinit TechProcessPaymentVC 实例时被调用。之后设置代表。因此它是nil。将您的init 方法修改为initWithDelegate,然后分配delegate 并在viewDidLoad 中使用它。

    编辑

    代码:

    TechProcessPaymentVC.h

    @interface TechProcessPaymentVC : UIViewController
    
    - (id) initWithDelegate:(id<techProcessDelegate>)delegate;
    
    @end
    

    TechProcessPaymentVC.m

    #import "TechProcessPaymentVC.h"
    
    @implementation TechProcessPaymentVC
    
    - (id) initWithDelegate:(id<techProcessDelegate>)delegate {
        self = [super init];
        if(self) {
            self.techDelegate = delegate;
        }
        return self;
    }
    
    @end
    

    修改你的调用

    -(IBAction)techProcessAction:(id)sender
    {
        TechProcessPaymentVC *techVC = [[TechProcessPaymentVC alloc]initWithDelegate:self];
        //....
    }
    

    希望有帮助!

    【讨论】:

    • 对不起,我不知道该怎么做..你能给我一些代码吗?
    • 感谢@Amar,但仍然在viewDidLoad 中得到Null,虽然我在initWithDelegate: 中得到它并且无法调用PaymentViewController 中的方法。
    • @Ankur 你能删除你在TechProcessPaymentVC 类中声明的ivar id techDelegate; 吗?只需财产声明就足够了。试试这个,让我知道。
    • 不走运,仍然无法正常工作。这是否取决于我在TechProcessPaymentVC *techVC = [[TechProcessPaymentVC alloc]initWithDelegate:self]; 之后使用 ` [self performSegueWithIdentifier:@"techProcess" sender:nil];` 的事实?
    【解决方案3】:

    如果您的目标视图控制器被包装到导航控制器中,您必须在 prepareForSegue 中以不同的方式引用它:

    UINavigationController *nav = segue.destinationViewController;
    DetailViewController *dvc = [nav.viewControllers objectAtIndex:0];
    

    【讨论】:

      【解决方案4】:

      在 TechProcessPaymentVC.h 中:

      @interface TechProcessPaymentVC : UIViewController<UIWebViewDelegate>
      {
          id techDelegate_;
      }
      @property (nonatomic, assign) id<techProcessDelegate> techDelegate;
      @end
      

      在 TechProcessPaymentVC.m 中:

      @implementation TechProcessPaymentVC
      @synthesize techDelegate = techDelegate_;
      
      - (void)viewDidLoad
      {
          [super viewDidLoad];
      
          NSLog(@"%@", techDelegate_);
      }
      .
      .
      .
      @end
      

      希望对你有用!!!

      【讨论】:

      • 这似乎不是很有帮助。在这种情况下,ivar 会对用户产生什么影响?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 2010-10-01
      相关资源
      最近更新 更多