如何使用委托/协议在多个视图控制器之间传递值 [英] How to Pass Values between Multiple View Controllers using Delegate / Protocol
问题描述
基本上,我现在打算使用委托在视图控制器之间传递值.
Basically, I am now intend to use delegate to pass values between view controllers.
视图控制器的流程是 A -> B -> C
The flow of the view controllers is A -> B -> C
当用户在C"视图控制器中执行某些操作时,如何将值传递回第一个视图控制器,即A"?
When the user does some action in the "C" view controller, how to pass the value back to the first view controller, which is "A"?
在我自己的代码中,从不触发委托方法,并且self.delegate"始终为null".我不确定为什么以及如何解决这个问题.
In my own code, the delegate method is never triggerred and "self.delegate" is always "null". I am not sure why and how to solve this problem.
下面是第一个VC和第三个VC的代码:
Below is the code of the First VC and Third VC:
#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
#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];
}
}
推荐答案
是的,可以这样做.为了从 C -> A 传回数据,您需要链接委托
Yes it's possible to do. In order to pass data back from C -> A, you need to chain delegates
故事板是这样的:http://i.imgur.com/9PXdlno.png?1
注意故事板中的segue identifier
FirstViewController:
import UIKit
class FirstViewController: UIViewController, SecondViewControllerDelegate {
@IBAction func buttonPressed(sender: AnyObject) {
performSegueWithIdentifier("goToSecondView", sender: self)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if(segue.identifier == "goToSecondView"){
let secondVC: SecondViewController = segue.destinationViewController as! SecondViewController
secondVC.delegate = self
}
}
func speakSecond(name: String) {
print("Data from Third view is: \(name)")
}
}
第二视图控制器:
import UIKit
protocol SecondViewControllerDelegate{
func speakSecond(name: String)
}
class SecondViewController: UIViewController, ThirdViewControllerDelegate {
var delegate: SecondViewControllerDelegate?
@IBAction func buttonPressed(sender: AnyObject) {
performSegueWithIdentifier("goToThirdView", sender: self)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if(segue.identifier == "goToThirdView"){
let thirdVC: ThirdViewController = segue.destinationViewController as! ThirdViewController
thirdVC.delegate = self
}
}
func speakThird(name: String) {
delegate?.speakSecond(name)
}
}
第三个视图控制器:
import UIKit
protocol ThirdViewControllerDelegate{
func speakThird(name: String)
}
class ThirdViewController: UIViewController {
var delegate: ThirdViewControllerDelegate?
@IBOutlet var textField: UITextField!
@IBAction func buttonPressed(sender: AnyObject) {
let text = textField.text
delegate?.speakThird(text)
self.navigationController?.popToRootViewControllerAnimated(true)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
这篇关于如何使用委托/协议在多个视图控制器之间传递值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!