Ios e> ViewControllerA您需要使用协议和委托或块,后者可以用作回调的松散耦合机制

Ios e> ViewControllerA您需要使用协议和委托或块,后者可以用作回调的松散耦合机制,ios,objective-c,swift,model-view-controller,uiviewcontroller,Ios,Objective C,Swift,Model View Controller,Uiviewcontroller,为此,我们将使ViewControllerA成为ViewControllerB的代表。这允许ViewControllerB将消息发送回ViewControllerA,使我们能够发送回数据 要使ViewControllerA成为ViewControllerB的代表,它必须符合我们必须指定的ViewControllerB协议。这将告诉ViewControllerA它必须实现哪些方法 在ViewControllerB.h中,在#import下方,但在@界面上方指定协议 @class ViewCont

为此,我们将使
ViewControllerA
成为
ViewControllerB
的代表。这允许
ViewControllerB
将消息发送回
ViewControllerA
,使我们能够发送回数据

要使
ViewControllerA
成为
ViewControllerB
的代表,它必须符合我们必须指定的
ViewControllerB
协议。这将告诉
ViewControllerA它必须实现哪些方法

  • ViewControllerB.h
    中,在
    #import
    下方,但在
    @界面
    上方指定协议

     @class ViewControllerB;
    
     @protocol ViewControllerBDelegate <NSObject>
     - (void)addItemViewController:(ViewControllerB *)controller didFinishEnteringItem:(NSString *)item;
     @end
    
     #import "ViewControllerB.h"
    
     @interface ViewControllerA : UIViewController <ViewControllerBDelegate>
    
  • ViewControllerB
    中,当我们弹出视图控制器时,调用
    代理上的消息

     NSString *itemToPassBack = @"Pass this value back to ViewControllerA";
     [self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack];
    
  • 这就是
    ViewControllerB
    。现在在
    ViewControllerA.h
    中,告诉
    ViewControllerA
    导入
    ViewControllerB
    ,并遵守其协议

     @class ViewControllerB;
    
     @protocol ViewControllerBDelegate <NSObject>
     - (void)addItemViewController:(ViewControllerB *)controller didFinishEnteringItem:(NSString *)item;
     @end
    
     #import "ViewControllerB.h"
    
     @interface ViewControllerA : UIViewController <ViewControllerBDelegate>
    
  • 在将
    viewControllerB
    推到导航堆栈之前,我们需要告诉
    viewControllerB
    ViewControllerA
    是它的委托,否则我们将得到一个错误

     ViewControllerB *viewControllerB = [[ViewControllerB alloc] initWithNib:@"ViewControllerB" bundle:nil];
     viewControllerB.delegate = self
     [[self navigationController] pushViewController:viewControllerB animated:YES];
    

  • 工具书类
  • 在《视图控制器编程指南》中
  • NSNotification center

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
      [tbl_View deselectRowAtIndexPath:indexPath animated:YES];
      News *newsObj = [newstitleArr objectAtIndex:indexPath.row];
      NewsDetailViewController *newsDetailView = [[NewsDetailViewController alloc] initWithNibName:@"NewsDetailViewController" bundle:nil];
    
      newsDetailView.newsHeadlineStr = newsObj.newsHeadline;
    
      [self.navigationController pushViewController:newsDetailView animated:YES];
    }
    
    这是传递数据的另一种方式

    // Add an observer in controller(s) where you want to receive data
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleDeepLinking:) name:@"handleDeepLinking" object:nil];
    
    -(void) handleDeepLinking:(NSNotification *) notification {
        id someObject = notification.object // Some custom object that was passed with notification fire.
    }
    
    // Post notification
    id someObject;
    [NSNotificationCenter.defaultCenter postNotificationName:@"handleDeepLinking" object:someObject];
    
    将数据从一个类传回另一个类(一个类可以是任何控制器、网络/会话管理器、UIView子类或任何其他类)

    块是匿名函数

    此示例将数据从控制器B传递到控制器A

    import UIKit
    
    class ViewControllerA: UIViewController  {
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        // MARK: Passing data through navigation PushViewController
        @IBAction func goToViewControllerB(_ sender: Any) {
    
            if let viewControllerB = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewControllerB") as? ViewControllerB {
                viewControllerB.isSomethingEnabled = true
                if let navigator = navigationController {
                    navigator.pushViewController(viewControllerB, animated: true)
                }
            }
        }
    }
    
    import UIKit
    
    class ViewControllerA: UIViewController  {
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        // MARK:  - - Passing Data through Segue  - -
        @IBAction func goToViewControllerBUsingSegue(_ sender: Any) {
            performSegue(withIdentifier: "showDetailSegue", sender: nil)
        }
    
        // Segue Delegate Method
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if (segue.identifier == "showDetailSegue") {
                let controller = segue.destination as? ViewControllerB
                controller?.isSomethingEnabled = true//passing data
            }
        }
    }
    
    import UIKit
    
    class ViewControllerA: UIViewController, ViewControllerBDelegate  {
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        // Delegate method
        func addItemViewController(_ controller: ViewControllerB?, didFinishEnteringItem item: String?) {
            print("Value from ViewControllerB's Delegate", item!)
        }
    
        @IBAction func goToViewControllerForDelegate(_ sender: Any) {
    
            if let viewControllerB = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewControllerB") as? ViewControllerB {
                viewControllerB.delegate = self
                if let navigator = navigationController {
                    navigator.pushViewController(viewControllerB, animated: true)
                }
            }
        }
    }
    
    import UIKit
    
    class ViewControllerA: UIViewController{
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Add observer in controller(s) where you want to receive data
            NotificationCenter.default.addObserver(self, selector: #selector(self.methodOfReceivedNotification(notification:)), name: Notification.Name("NotificationIdentifier"), object: nil)
        }
    
        // MARK: Method for receiving Data through Post Notification
        @objc func methodOfReceivedNotification(notification: Notification) {
            print("Value of notification: ", notification.object ?? "")
        }
    }
    
    import UIKit
    
    class ViewControllerA: UIViewController  {
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        // MARK:Method for receiving Data through Block
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if (segue.identifier == "showDetailSegue") {
                let controller = segue.destination as? ViewControllerB
                controller?.isSomethingEnabled = true
    
                // Receiver Block
                controller!.authorizationCompletionBlock = { isGranted in
                    print("Data received from Block is: ", isGranted)
                }
            }
        }
    }
    
    定义块

    @property void(^selectedVoucherBlock)(NSString *); // in ContollerA.h
    
    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:
    (NSIndexPath *)indexPath {
        NSString *voucher = vouchersArray[indexPath.row];
        if (sourceVC.selectVoucherBlock) {
            sourceVC.selectVoucherBlock(voucher);
        }
        [self.navigationController popToViewController:sourceVC animated:YES];
    }
    
    添加块处理程序(侦听器)

    您需要一个值的地方(例如,您需要ControllerA中的API响应,或者您需要a上的CONTORLERB数据)

    转到控制器B

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    ControllerB *vc = [storyboard instantiateViewControllerWithIdentifier:@"ControllerB"];
    vc.sourceVC = self;
        [self.navigationController pushViewController:vc animated:NO];
    
    import UIKit
    
    class ViewControllerB: UIViewController {
    
        // MARK:  - Variable for Passing Data through Navigation push
        var isSomethingEnabled = false
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Print value received through navigation push
            print("Value of 'isSomethingEnabled' from ViewControllerA: ", isSomethingEnabled)
        }
    }
    
    import UIKit
    
    class ViewControllerB: UIViewController {
        var isSomethingEnabled = false
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Print value received through segue
            print("Value of 'isSomethingEnabled' from ViewControllerA: ", isSomethingEnabled)
        }
    }
    
    import UIKit
    
    //Protocol decleare
    protocol ViewControllerBDelegate: NSObjectProtocol {
        // Classes that adopt this protocol MUST define
        // this method -- and hopefully do something in
        // that definition.
        func addItemViewController(_ controller: ViewControllerB?, didFinishEnteringItem item: String?)
    }
    
    class ViewControllerB: UIViewController {
        var delegate: ViewControllerBDelegate?
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // MARK:  - - - -  Set Data for Passing Data through Delegate  - - - - - -
            delegate?.addItemViewController(self, didFinishEnteringItem: "Data for ViewControllerA")
        }
    }
    
    import UIKit
    
    class ViewControllerB: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // MARK:Set data for Passing Data through Post Notification
            let objToBeSent = "Test Message from Notification"
            NotificationCenter.default.post(name: Notification.Name("NotificationIdentifier"), object: objToBeSent)
        }
    }
    
    import UIKit
    
    class ViewControllerB: UIViewController {
    
        // MARK: Variable for Passing Data through Block
        var authorizationCompletionBlock:((Bool)->())? = {_ in}
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // MARK: Set data for Passing Data through Block
            if authorizationCompletionBlock != nil
            {
                authorizationCompletionBlock!(true)
            }
        }
    }
    
    防火块

    @property void(^selectedVoucherBlock)(NSString *); // in ContollerA.h
    
    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:
    (NSIndexPath *)indexPath {
        NSString *voucher = vouchersArray[indexPath.row];
        if (sourceVC.selectVoucherBlock) {
            sourceVC.selectVoucherBlock(voucher);
        }
        [self.navigationController popToViewController:sourceVC animated:YES];
    }
    

    这是一个非常古老的答案,这是反模式的。请使用代理。不要使用这种方法

    1。在第二个视图控制器中创建第一个视图控制器的实例,并使其属性
    @property(非原子,赋值)

    2。分配此视图控制器的
    SecondviewController
    实例

     NSString *itemToPassBack = @"Pass this value back to ViewControllerA";
     [self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack];
    

    2。完成选择操作后,将阵列复制到第一个视图控制器。卸载第二个视图时,第一个视图将保存阵列数据。

    如果要将数据从一个视图控制器发送到另一个视图控制器,请使用以下方法:

    假设我们有viewControllerA和viewControllerB

    var isSomethingEnabled = false
    
    var delegate: ViewControllerBDelegate?
    
    delegate?.addItemViewController(self, didFinishEnteringItem: "Data for ViewControllerA")
    
    let objToBeSent = "Test Message from Notification"
            NotificationCenter.default.post(name: Notification.Name("NotificationIdentifier"), object: objToBeSent)
    
    if authorizationCompletionBlock != nil
    {
        authorizationCompletionBlock!(true)
    }
    
    现在在viewControllerB.h文件中

    在文件viewControllerB.m中:

    在文件viewControllerA.m中:


    因此,这就是如何在不设置任何委托的情况下将数据从viewControllerA传递到viewControllerB的方法。;)

    OP没有提到视图控制器,但很多答案都提到了,因此我想补充一下LLVM的一些新功能,当我想将数据从一个视图控制器传递到另一个视图控制器,然后返回一些结果时,这些新功能使这一点变得更容易

    故事板分段、ARC和LLVM块对我来说比以往任何时候都更容易。上述的一些答案已经提到了故事板和片段,但仍然依赖于授权。定义委托当然有效,但有些人可能会发现传递指针或代码块更容易

    有了uinavigator和segue,就有了将信息传递给从属控制器并将信息取回的简单方法。ARC使传递指向从NSObjects派生的对象的指针变得简单,因此如果您希望从属控制器为您添加/更改/修改某些数据,请向其传递指向可变实例的指针。块使传递操作变得容易,因此如果您希望从属控制器调用更高级别控制器上的操作,请传递一个块。您可以定义块来接受对您有意义的任意数量的参数。如果更适合的话,还可以将API设计为使用多个块

    下面是两个简单的segue胶水示例。第一个是直接显示一个为输入传递的参数,第二个为输出传递的参数

    // Prepare the destination view controller by passing it the input we want it to work on
    // and the results we will look at when the user has navigated back to this controller's view.
    
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        [[segue destinationViewController]
    
         // This parameter gives the next controller the data it works on.
         segueHandoffWithInput:self.dataForNextController
    
         // This parameter allows the next controller to pass back results
         // by virtue of both controllers having a pointer to the same object.
         andResults:self.resultsFromNextController];
    }
    
    第二个示例显示为第二个参数传递回调块。我喜欢使用块,因为它将相关细节紧密地放在源代码中——更高级别的源代码中

    // Prepare the destination view controller by passing it the input we want it to work on
    // and the callback when it has done its work.
    
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        [[segue destinationViewController]
    
         // This parameter gives the next controller the data it works on.
         segueHandoffWithInput:self.dataForNextController
    
         // This parameter allows the next controller to pass back results.
         resultsBlock:^(id results) {
             // This callback could be as involved as you like.
             // It can use Grand Central Dispatch to have work done on another thread for example.
            [self setResultsFromNextController:results];
        }];
    }
    

    我一直在寻找这个解决方案,终于找到了。首先,声明SecondViewController.h文件中的所有对象,如

    @interface SecondViewController: UIviewController
    {
        NSMutableArray *myAray;
        CustomObject *object;
    }
    
    现在在实现文件中,为以下对象分配内存:

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
         self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
         if (self)
         {
             // Custom initialization
             myAray=[[NSMutableArray alloc] init];
             object=[[CustomObject alloc] init];
         }
         return self;
    }
    
    现在您已经为
    数组
    和对象分配了内存。现在,您可以在按下此
    ViewController
    之前填充该内存

    转到SecondViewController.h并编写两种方法:

    -(void)setMyArray:(NSArray *)_myArray;
    -(void)setMyObject:(CustomObject *)_myObject;
    
    在实现文件中,您可以实现以下功能:

    -(void)setMyArray:(NSArray *)_myArray
    {
         [myArra addObjectsFromArray:_myArray];
    }
    
    -(void)setMyObject:(CustomObject *)_myObject
    {
         [object setCustomObject:_myObject];
    }
    
    希望您的
    CustomObject
    必须具有setter函数

    现在你的基本工作完成了。转到要按下
    SecondViewController
    的位置,然后执行以下操作:

    SecondViewController *secondView= [[SecondViewController alloc] initWithNibName:@"SecondViewController " bundle:[NSBundle MainBundle]] ;
    [secondView setMyArray:ArrayToPass];
    [secondView setMyObject:objectToPass];
    [self.navigationController pushViewController:secondView animated:YES ];
    

    注意拼写错误。

    在使用.xib文件时,委派是执行此类操作的唯一解决方案。但是,前面的所有答案都是针对.xibs文件的
    故事板
    。你需要授权。这是你唯一可以使用的解决方案


    另一个解决方案是使用singleton类模式。初始化一次并在整个应用程序中使用。

    共享数据有多种方法

  • 您可以始终使用
    NSUserDefaults
    共享数据。设置要与所选键共享的值,并从与该键关联的
    NSUserDefault
    中获取该值
     @synthesize strValue;
    
     @property (strong, nonatomic)  NSString *strValue;
    
     SecondViewController *secondView= [[SecondViewController alloc]
     initWithNibName:@"SecondViewController " bundle:[NSBundle MainBundle]];
    
     [secondView setStrSecondValue:StrFirstValue];
    
     [self.navigationController pushViewController:secondView animated:YES ];
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
      [tbl_View deselectRowAtIndexPath:indexPath animated:YES];
      News *newsObj = [newstitleArr objectAtIndex:indexPath.row];
      NewsDetailViewController *newsDetailView = [[NewsDetailViewController alloc] initWithNibName:@"NewsDetailViewController" bundle:nil];
    
      newsDetailView.newsHeadlineStr = newsObj.newsHeadline;
    
      [self.navigationController pushViewController:newsDetailView animated:YES];
    }
    
    @interface NewsDetailViewController : UIViewController
    @property(nonatomic,retain) NSString *newsHeadlineStr;
    @end
    
    @synthesize newsHeadlineStr;
    
    @property (nonatomic, retain) NSString *str;
    
    @property (nonatomic, retain) NSString *str1;
    
    - (void)viewDidLoad
       {
         // Message for the second SecondViewController
         self.str = @"text message";
    
         [super viewDidLoad];
       }
    
    -(IBAction)ButtonClicked
     {
       SecondViewController *secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
       secondViewController.str1 = str;
      [self.navigationController pushViewController:secondViewController animated:YES];
     }
    
    @property (strong, nonatomic) NSString *indexNumber;
    
    NextVC *vc = [[NextVC alloc]init];
    
    vc.indexNumber = @"123";
    
    [self.navigationController vc animated:YES];
    
    - (void)pushToController2 {
    
        Controller2 *obj = [[Controller2 alloc] initWithNib:@"Controller2" bundle:nil];
        [obj passValue:@"String"];
        [self pushViewController:obj animated:YES];
    }
    
    @interface Controller2  : NSObject
    
    @property (nonatomic, strong) NSString* stringPassed;
    
    @end
    
    @implementation Controller2
    
    @synthesize stringPassed = _stringPassed;
    
    - (void) passValue:(NSString *)value {
    
        _stringPassed = value; // Or self.stringPassed = value
    }
    
    @end
    
    - (void)pushToController2 {
    
        Controller2 *obj = [[Controller2 alloc] initWithNib:@"Controller2" bundle:nil];
        [obj setStringPassed:@"String"];
        [self pushViewController:obj animated:YES];
    }
    
    Controller2 *obj = [[Controller2 alloc] initWithNib:@"Controller2" bundle:nil];
    [obj passValue:@“String1” andValues:objArray withDate:date];
    
    ModelClass *modelObject = [[ModelClass alloc] init];
    modelObject.property1 = _property1;
    modelObject.property2 = _property2;
    modelObject.property3 = _property3;
    
    Controller2 *obj = [[Controller2 alloc] initWithNib:@"Controller2" bundle:nil];
    [obj passmodel: modelObject];
    
    NextViewController *destinationVC = (NextViewController *) segue.destinationViewController;
    [destinationVC setDidFinishUsingBlockCallback:^(NextViewController *destinationVC)
    {
        self.blockLabel.text = destination.blockTextField.text;
    }];
    
    -(IBAction)UnWindDone:(UIStoryboardSegue *)segue { }
    
     -(IBAction)UnWindDone:(UIStoryboardSegue *)segue {
         NextViewController *nextViewController = segue.sourceViewController;
         self.unwindLabel.text = nextViewController.unwindPropertyPass;
     }
    
    @optional
    
    - (void)checkStateDidChange:(BOOL)checked;
    
    #import "ViewController1Delegate.h"
    
    @interface ViewController2: UIViewController<ViewController1Delegate>
    
    - (void)checkStateDidChange:(BOOL)checked {
         if (checked) {
               // Do whatever you want here
               NSLog(@"Checked");
         }
         else {
               // Also do whatever you want here
               NSLog(@"Not checked");
         }
    }
    
    @property (weak, nonatomic) id<ViewController1Delegate> delegate;
    
    ViewController1* controller = [[NSBundle mainBundle] loadNibNamed:@"ViewController1" owner:self options:nil][0];
    controller.delegate = self;
    [self presentViewController:controller animated:YES completion:nil];
    
    [delegate checkStateDidChange:checked]; // You pass here YES or NO based on the check state of your control
    
    // Register activities
    
    MCViewFactory *factory = [MCViewFactory sharedFactory];
    
    // The following two lines are optional.
    [factory registerView:@"YourSectionViewController"];
    
    MCIntent* intent = [MCIntent intentWithSectionName:@"YourSectionViewController"];
    [intent setAnimationStyle:UIViewAnimationOptionTransitionFlipFromLeft];
    [[intent savedInstanceState] setObject:@"someValue" forKey:@"yourKey"];
    [[intent savedInstanceState] setObject:@"anotherValue" forKey:@"anotherKey"];
    // ...
    [[MCViewModel sharedModel] setCurrentSection:intent];
    
    -(void)onResume:(MCIntent *)intent {
        NSObject* someValue = [intent.savedInstanceState objectForKey:@"yourKey"];
        NSObject* anotherValue = [intent.savedInstanceState objectForKey:@"anotherKey"];
    
        // ...
    
        // Ensure the following line is called, especially for MCSectionViewController
        [super onResume:intent];
    }
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    
        // This solution is for using Core Data
        YourCDEntityName * value = (YourCDEntityName *)[[self fetchedResultsController] objectAtIndexPath: indexPath];
    
        YourSecondViewController * details = [self.storyboard instantiateViewControllerWithIdentifier:@"nameOfYourSecondVC"]; // Make sure in storyboards you give your second VC an identifier
    
        // Make sure you declare your value in the second view controller
        details.selectedValue = value;
    
        // Now that you have said to pass value all you need to do is change views
        [self.navigationController pushViewController: details animated:YES];
    
    }
    
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        var next = segue.destinationViewController as NextViewController
        next.dataSource = dataSource
    }
    
    func viewDidLoad() {
        super.viewDidLoad()
        var data = dataAccess.requestData()
    }
    
    let notebookName = note.notebook.name
    
    + (HouseholdInventoryManager*) sharedManager; {
        static dispatch_once_t onceQueue;
        static HouseholdInventoryManager* _sharedInstance;
    
        // dispatch_once is guaranteed to only be executed
        // once in the lifetime of the application
        dispatch_once(&onceQueue, ^{
            _sharedInstance = [[self alloc] init];
        });
        return _sharedInstance;
    }
    
    #import <Foundation/Foundation.h>
    
    @class JGCHouseholdInventoryItem;
    
    @interface HouseholdInventoryManager : NSObject
    /*!
     The global singleton for accessing application data
     */
    + (HouseholdInventoryManager*) sharedManager;
    
    
    - (NSArray *) entireHouseholdInventory;
    - (NSArray *) luxuryItems;
    - (NSArray *) nonInsuredItems;
    
    - (void) addHouseholdItemToHomeInventory:(JGCHouseholdInventoryItem*)item;
    - (void) editHouseholdItemInHomeInventory:(JGCHouseholdInventoryItem*)item;
    - (void) deleteHoueholdItemFromHomeInventory:(JGCHouseholdInventoryItem*)item;
    @end
    
     @property (nonatomic, strong) NSString *str1;
    
     @property (nonatomic, strong) NSString *str2;
    
    @interface ViewControllerTwo ()
    @end
    @implementation ViewControllerTwo
    @synthesize str2;
    
     - (void)viewDidLoad
     {
       [super viewDidLoad];
    
       // Data or string you wants to pass in ViewControllerTwo...
       self.str1 = @"hello world";
     }
    
    -(IBAction)ButtonClicked
    {
      // Navigation on buttons click event from ViewControlerOne to ViewControlerTwo with transferring data or string..
      ViewControllerTwo *objViewTwo = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewControllerTwo"];
      obj.str2 = str1;
      [self.navigationController pushViewController: objViewTwo animated:YES];
    }
    
    - (void)viewDidLoad
    {
      [super viewDidLoad];
      NSLog(@"%@", str2);
    }
    
    AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    
    import UIKit
    
    class FirstViewController: UIViewController {
    
        @IBOutlet weak var textField: UITextField!
    
        // This function is called before the segue
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    
            // Get a reference to the second view controller
            let secondViewController = segue.destination as! SecondViewController
    
            // Set a variable in the second view controller with the String to pass
            secondViewController.receivedString = textField.text!
        }
    
    }
    
    import UIKit
    
    class SecondViewController: UIViewController {
    
        @IBOutlet weak var label: UILabel!
    
        // This variable will hold the data being passed from the First View Controller
        var receivedString = ""
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Used the text from the First View Controller to set the label
            label.text = receivedString
        }
    
    }
    
    import UIKit
    
    class FirstViewController: UIViewController, DataEnteredDelegate {
    
        @IBOutlet weak var label: UILabel!
    
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if segue.identifier == "showSecondViewController" {
                let secondViewController = segue.destination as! SecondViewController
                secondViewController.delegate = self
            }
        }
    
        func userDidEnterInformation(info: String) {
            label.text = info
        }
    }
    
    import UIKit
    
    // Protocol used for sending data back
    protocol DataEnteredDelegate: AnyObject {
        func userDidEnterInformation(info: String)
    }
    
    class SecondViewController: UIViewController {
    
        // Making this a weak variable, so that it won't create a strong reference cycle
        weak var delegate: DataEnteredDelegate? = nil
    
        @IBOutlet weak var textField: UITextField!
    
        @IBAction func sendTextBackButton(sender: AnyObject) {
    
            // Call this method on whichever class implements our delegate protocol
            delegate?.userDidEnterInformation(info: textField.text!)
    
            // Go back to the previous view controller
            _ = self.navigationController?.popViewController(animated: true)
        }
    }
    
    import UIKit
    
    
    class ViewControllerSender: UIViewController {
    
        // THE STUFF - put some information into a variable
        let favoriteMovie = "Ghost Busters"
    
        override func viewDidAppear(animated: Bool) {
            // PASS IDENTIFIER - go to the receiving view controller.
            self.performSegueWithIdentifier("goToReciever", sender: self)
        }
    
        override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    
            // GET REFERENCE - ...to the receiver view.
            var viewControllerReceiver = segue.destinationViewController as? ViewControllerReceiver
    
            // PASS STUFF - pass the variable along to the target.
            viewControllerReceiver!.yourFavMovie = self.favoriteMovie
    
        }
    }
    
    import UIKit
    
    class ViewControllerReceiver: UIViewController {
    
        // Basic empty variable waiting for you to pass in your fantastic favorite movie.
        var yourFavMovie = ""
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // And now we can view it in the console.
            println("The Movie is \(self.yourFavMovie)")
    
        }
    }
    
    var isSomethingEnabled = false
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Print value received through segue, navigation push
        print("Value of 'isSomethingEnabled' from ViewControllerA: ", isSomethingEnabled)
    }
    
    if let viewControllerB = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewControllerB") as? ViewControllerB {
        viewControllerB.isSomethingEnabled = true
        if let navigator = navigationController {
            navigator.pushViewController(viewControllerB, animated: true)
        }
    }
    
    import UIKit
    
    class ViewControllerA: UIViewController  {
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        // MARK: Passing data through navigation PushViewController
        @IBAction func goToViewControllerB(_ sender: Any) {
    
            if let viewControllerB = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewControllerB") as? ViewControllerB {
                viewControllerB.isSomethingEnabled = true
                if let navigator = navigationController {
                    navigator.pushViewController(viewControllerB, animated: true)
                }
            }
        }
    }
    
    import UIKit
    
    class ViewControllerB: UIViewController {
    
        // MARK:  - Variable for Passing Data through Navigation push
        var isSomethingEnabled = false
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Print value received through navigation push
            print("Value of 'isSomethingEnabled' from ViewControllerA: ", isSomethingEnabled)
        }
    }
    
    import UIKit
    
    class ViewControllerA: UIViewController  {
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        // MARK:  - - Passing Data through Segue  - -
        @IBAction func goToViewControllerBUsingSegue(_ sender: Any) {
            performSegue(withIdentifier: "showDetailSegue", sender: nil)
        }
    
        // Segue Delegate Method
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if (segue.identifier == "showDetailSegue") {
                let controller = segue.destination as? ViewControllerB
                controller?.isSomethingEnabled = true//passing data
            }
        }
    }
    
    import UIKit
    
    class ViewControllerB: UIViewController {
        var isSomethingEnabled = false
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Print value received through segue
            print("Value of 'isSomethingEnabled' from ViewControllerA: ", isSomethingEnabled)
        }
    }
    
    protocol ViewControllerBDelegate: NSObjectProtocol {
    
        // Classes that adopt this protocol MUST define
        // this method -- and hopefully do something in
        // that definition.
        func addItemViewController(_ controller: ViewControllerB?, didFinishEnteringItem item: String?)
    }
    
    var delegate: ViewControllerBDelegate?
    
    delegate?.addItemViewController(self, didFinishEnteringItem: "Data for ViewControllerA")
    
    class ViewControllerA: UIViewController, ViewControllerBDelegate  {
    // to do
    }
    
    if let viewControllerB = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewControllerB") as? ViewControllerB {
        viewControllerB.delegate = self//confirming delegate
        if let navigator = navigationController {
            navigator.pushViewController(viewControllerB, animated: true)
        }
    }
    
    func addItemViewController(_ controller: ViewControllerB?, didFinishEnteringItem item: String?) {
        print("Value from ViewControllerB's Delegate", item!)
    }
    
    import UIKit
    
    class ViewControllerA: UIViewController, ViewControllerBDelegate  {
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        // Delegate method
        func addItemViewController(_ controller: ViewControllerB?, didFinishEnteringItem item: String?) {
            print("Value from ViewControllerB's Delegate", item!)
        }
    
        @IBAction func goToViewControllerForDelegate(_ sender: Any) {
    
            if let viewControllerB = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewControllerB") as? ViewControllerB {
                viewControllerB.delegate = self
                if let navigator = navigationController {
                    navigator.pushViewController(viewControllerB, animated: true)
                }
            }
        }
    }
    
    import UIKit
    
    //Protocol decleare
    protocol ViewControllerBDelegate: NSObjectProtocol {
        // Classes that adopt this protocol MUST define
        // this method -- and hopefully do something in
        // that definition.
        func addItemViewController(_ controller: ViewControllerB?, didFinishEnteringItem item: String?)
    }
    
    class ViewControllerB: UIViewController {
        var delegate: ViewControllerBDelegate?
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // MARK:  - - - -  Set Data for Passing Data through Delegate  - - - - - -
            delegate?.addItemViewController(self, didFinishEnteringItem: "Data for ViewControllerA")
        }
    }
    
    let objToBeSent = "Test Message from Notification"
            NotificationCenter.default.post(name: Notification.Name("NotificationIdentifier"), object: objToBeSent)
    
    NotificationCenter.default.addObserver(self, selector: #selector(self.methodOfReceivedNotification(notification:)), name: Notification.Name("NotificationIdentifier"), object: nil)
    
    @objc func methodOfReceivedNotification(notification: Notification) {
        print("Value of notification: ", notification.object ?? "")
    }
    
    import UIKit
    
    class ViewControllerA: UIViewController{
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Add observer in controller(s) where you want to receive data
            NotificationCenter.default.addObserver(self, selector: #selector(self.methodOfReceivedNotification(notification:)), name: Notification.Name("NotificationIdentifier"), object: nil)
        }
    
        // MARK: Method for receiving Data through Post Notification
        @objc func methodOfReceivedNotification(notification: Notification) {
            print("Value of notification: ", notification.object ?? "")
        }
    }
    
    import UIKit
    
    class ViewControllerB: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // MARK:Set data for Passing Data through Post Notification
            let objToBeSent = "Test Message from Notification"
            NotificationCenter.default.post(name: Notification.Name("NotificationIdentifier"), object: objToBeSent)
        }
    }
    
    if authorizationCompletionBlock != nil
    {
        authorizationCompletionBlock!(true)
    }
    
    // Receiver Block
    controller!.authorizationCompletionBlock = { isGranted in
        print("Data received from Block is: ", isGranted)
    }
    
    import UIKit
    
    class ViewControllerA: UIViewController  {
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        // MARK:Method for receiving Data through Block
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if (segue.identifier == "showDetailSegue") {
                let controller = segue.destination as? ViewControllerB
                controller?.isSomethingEnabled = true
    
                // Receiver Block
                controller!.authorizationCompletionBlock = { isGranted in
                    print("Data received from Block is: ", isGranted)
                }
            }
        }
    }
    
    import UIKit
    
    class ViewControllerB: UIViewController {
    
        // MARK: Variable for Passing Data through Block
        var authorizationCompletionBlock:((Bool)->())? = {_ in}
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // MARK: Set data for Passing Data through Block
            if authorizationCompletionBlock != nil
            {
                authorizationCompletionBlock!(true)
            }
        }
    }
    
    class UserSettings: ObservableObject {
         @Published var score = 0
    }