我有一个'主屏幕',有两个标签可以保存计数。我有两个不同的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];
}
答案 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;
这就是它的全部内容。