两个相同的Objective-c代表 - 一个工作,另一个不工作

时间:2015-02-15 18:53:54

标签: ios objective-c uiviewcontroller delegates

我有一个'主屏幕',有两个标签可以保存计数。我有两个不同的UIViewControllers,它们是 HomeViewController 的代理。 ViewControllerA 调用该方法。

ViewControllerB 设置完全相同,但命名除外,不会调用该方法。

我做错了什么?

HomeViewController.h

#import "ViewControllerA.h"
#import "ViewControllerB.h"

@interface HomeViewController : UIViewController <ViewControllerADelegate, ViewControllerBDelegate>

HomeViewController.m

- (void) updatedLabel {
    NSLog(@"Updating label count");
}

- (IBAction)btnA:(id)sender {
    [self performSegueWithIdentifier:@"segue_a" sender:self];
}

- (IBAction)btnB:(id)sender {

    [self performSegueWithIdentifier:@"segue_b" sender:self];

}

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"segue_a"]) {
        ViewControllerA * vca = (ViewControllerA*) segue.destinationViewController;
         vca.delegate = self;
    }

    if ([[segue identifier] isEqualToString:@"segue_b"]) {
        ViewControllerB *vcb = (ViewControllerB*) segue.destinationViewController;
        vcb.delegate = self;
    }

}

ViewControllerA.h

@class ViewControllerA;

@protocol ViewControllerADelegate <NSObject>
- (void) updatedLabel;
@end

@interface ViewControllerA : UIViewController <UITextFieldDelegate>

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

ViewControllerA.m

- (IBAction)returnHome:(id)sender {
    [self.delegate updatedLabel];
    [self dismissViewControllerAnimated:YES completion:nil];
}

ViewControllerB.h

@class ViewControllerB;
@protocol ViewControllerBDelegate <NSObject>
- (void) updatedLabel;
@end

@interface ViewControllerB : UIViewController<AVCaptureMetadataOutputObjectsDelegate>

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

ViewControllerB.m

- (IBAction)returnHome:(id)sender {
    [self.delegate updatedLabel];
    [self dismissViewControllerAnimated:YES completion:nil];
}

3 个答案:

答案 0 :(得分:0)

您是否正在HomeViewController中实现ViewControllerADelegate和ViewControllerBDelegate协议。两个协议都有相同的方法updatedLabel,这是不明确的?

编辑1: 请与调试器核实vcb.delegate不是nil。

编辑2: 如果您的ViewControllerB嵌入在UINavigationController中,那么segue.destinationViewController将返回UINavigationController而不是ViewControllerB

答案 1 :(得分:0)

很难说出了什么问题。是时候卷起袖子并进行调试了。在prepareForSegue中设置断点并逐步执行,确保它在两个视图控制器类上设置委托。还要在两个视图控制器上的returnHome方法上设置断点,并确保delegate属性不为nil。然后,当您进入代理呼叫时,单击“步入”按钮并观察它进入委托方法。

答案 2 :(得分:0)

回答遇到类似问题的人: ViewControllerA未嵌入NavigationController中。 ViewControllerB WAS嵌入在NavigationController中。

用户tgebarowski在评论中指出,如果ViewControllerB嵌入在UINavigationController中,那么segue.destinationViewController将返回UINavigationController而不是ViewControllerB。

因此,要解决此问题,如果要通过Segue创建委托,请使用以下命令。

    UINavigationController * nvc = (UINavigationController*)segue.destinationViewController;
    ViewControllerB *vcb = [nvc childViewControllers][0];
    vcb.delegate = self;

这就是它的全部内容。