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

Two identical objective-c delegates - one works, the other does not

我有一个 'home screen',它有两个保存计数的标签。我有两个不同的 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];
}

会不会是你在HomeViewController中实现了ViewControllerADelegate和ViewControllerBDelegate协议。两种协议都有相同的方法 updatedLabel,这是不明确的吗?

编辑 1: 使用调试器检查 vcb.delegate 不为零。

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

很难说出了什么问题。是时候卷起袖子调试它了。在您的 prepareForSegue 中设置一个断点并单步执行,确保它在视图控制器的两个 类 上都设置了委托。同时在两个视图控制器的 returnHome 方法上设置断点,并确保委托 属性 不为 nil。然后,当您到达委托调用时,单击 "step into" 按钮并观察它进入委托方法。

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

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

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

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

仅此而已。