代表不响应选择器

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

XEP-0124 / BOSH:在响应中省略 ACK

Rancher 2.0 - 故障排除和修复“控制器管理器不健康问题”

Apache Jmeter 对网页的响应时间太长

动态 Jquery 选择器不起作用

CTO 首次分享|为啥我选择 Spring 响应式编程?