两个相同的 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;
仅此而已。
我有一个 '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;
仅此而已。