【问题标题】: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,但它不是由系统分配的

标签: ios objective-c uiviewcontroller delegates protocols


【解决方案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 中拥有委托后,您可以直接将消息传递给它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
相关资源
最近更新 更多