[英]How to pass values between 2 View Controllers without protocol?
[英]How to Pass Values between Multiple View Controllers using Delegate / Protocol
基本上,我現在打算使用委托在視圖控制器之間傳遞值。
視圖控制器的流是A-> B-> C
當用戶在“ C”視圖控制器中執行某些操作時,如何將值傳遞回第一個視圖控制器“ A”?
在我自己的代碼中,委托方法永遠不會觸發,並且“ self.delegate”始終為“ null”。 我不確定為什么以及如何解決這個問題。
下面是第一個VC和第三個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];
}
}
上面的代碼沒有顯示您在UIViewController
哪里設置委托。 這可能是為什么它為nil以及為什么永遠不會觸發您的委托方法的原因。 在初始化UIViewController
但在像這樣推送它之前設置委托屬性:
// Inside your third viewcontroller class:
@interface ThirdViewController ()
@property (weak, nonatomic) id delegate; // make sure the delegate is set to weak
@end
// Maybe in your AppDelegate, before you push the third view controller
ThirdViewController *thirdVC = [[ThirdViewController alloc] init];
thirdVC.delegate = self;
// Now push the VC. The below assumes a UINavigationController but that detail isn't important.
[self.navigationController pushViewController:thirdVC animated:YES];
是的,有可能做。 為了從C-> A傳回數據,您需要鏈接代表
這是情節提要的外觀: http : //i.imgur.com/9PXdlno.png?1
在情節提要中注意標記標識符
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)")
}
}
SecondViewController:
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)
}
}
ThirdViewController:
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.
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.