代表不响应选择器
Posted
技术标签:
【中文标题】代表不响应选择器【英文标题】:Delegate not responds to selector 【发布时间】:2015-07-28 08:58:46 【问题描述】:基本上,我现在打算使用委托在视图控制器之间传递值。
视图控制器的流程是 A -> B -> C 使用 push segue。
当用户在“C”视图控制器中执行某些操作时,如何将值 BACK 传递给第一个视图控制器,即“A”?
在我的代码中,“self.delegate”始终为 nil,并且永远不会触发委托方法。
下面是First VC和Third VC的代码:
第一个 VC .m:
#import "ViewController.h"
#import "ThirdViewController.h"
@interface ViewController ()<PassValueProtocal>
@property (weak, nonatomic) IBOutlet UILabel *myLabel;
@end
@implementation ViewController
ThirdViewController *thirdVC;
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
- (void) passValueBack:(NSString *)value
NSLog(@"HAHAH");
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
- (IBAction)segueToSecondVC:(UIButton *)sender
thirdVC = [ThirdViewController sharedManager];
thirdVC.delegate = self;
@end
第三个 VC .h:
#import <UIKit/UIKit.h>
@protocol PassValueProtocal <NSObject>
- (void) passValueBack: (NSString *) value;
@end
@interface ThirdViewController : UIViewController
@property (weak, nonatomic) id<PassValueProtocal>delegate;
+ (id) sharedManager;
@end
第三个 VC .m:
#import "ThirdViewController.h"
@interface ThirdViewController ()
@property (weak, nonatomic) IBOutlet UITextField *myTextField;
@end
@implementation ThirdViewController
+ (id) sharedManager
NSLog(@"myDelegate sharedManager");
static ThirdViewController *sharedManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^ sharedManager = [[self alloc] init]; );
return sharedManager;
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view.
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
- (IBAction)passValueAction:(UIButton *)sender
NSLog(@"%@", self.delegate);
if ([self.delegate respondsToSelector:@selector(passValueBack:)])
[self.delegate passValueBack:self.myTextField.text];
@end
【问题讨论】:
您推送 ThirdVC 的 SecondVC 代码在哪里。此时,您需要将委托从第二个传递到第三个。这样,ThirdVC 就会有委托。 @iosDev82 你的意思是delegate只能和两个有segue关系的view controller进行通信吗? 无意冒犯,但您的问题确实不妥。一开始你说的是 3 个 VC,但你的代码有 2 个视图控制器。 @iosDev82 抱歉。我只是将第二个VC留空,因为我认为这是第一个VC和第三个VC之间的通信。我需要为 secondVC 写什么?它的作用就像一座桥梁吗?对不起,我是委托的新手... 如果你从storyboard创建一个UIViewController,它不会调用sharedManager。它将分配一个新的 ThirdViewController 对象。所以即使你将delegate设置为ThirdViewController,但它不是由系统分配的 【参考方案1】:你的代码
- (IBAction)segueToSecondVC:(UIButton *)sender
thirdVC = [ThirdViewController sharedManager];
thirdVC.delegate = self;
不应该在这里。您应该实现函数prepareForSegue
并将此代码移到那里。像
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
ThirdViewController *thirdVC = (ThirdViewController *)segue.destinationViewController;
thirdVC.delegate = self;
【讨论】:
非常感谢!我知道如何在两个视图控制器之间使用委托,只需使用您提供的方法。但这似乎是从 firstVC 直接转到 thirdVC 的?因为firstVC的destinationVC应该是secondVC而不是thirdVC。因此,无论如何将值从 thirdVC 传递回 firstVC,但 segue 通过 firstVC -> secondVC ->thirdVC? 另外,是否可以将值从thirdVC直接传回firstVC? @MikeZhu 在您共享的代码中,您有一个按钮可以从 FirstVC 到 ThirdVC 进行某种转换。无论哪种情况,您都应该在prepareForSegue
中设置委托,并在 SecondVC 的 prepareForSegue
中执行相同的操作。这次您应该将 SecondVC 的委托(即 fristVC)传递给 ThirdVC 委托。在 ThirdVC 中拥有委托后,您可以直接将消息传递给它。以上是关于代表不响应选择器的主要内容,如果未能解决你的问题,请参考以下文章
Wildfly 安全管理器不处理 JndiPermission