【发布时间】: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