Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios BOOL的属性 @property (nonatomic, assign) BOOL isSomethingEnabled; @property (nonatomic, assign) BOOL isSomethingEnabled;_Ios_Objective C_Swift_Model View Controller_Uiviewcontroller - Fatal编程技术网

Ios BOOL的属性 @property (nonatomic, assign) BOOL isSomethingEnabled; @property (nonatomic, assign) BOOL isSomethingEnabled;

Ios BOOL的属性 @property (nonatomic, assign) BOOL isSomethingEnabled; @property (nonatomic, assign) BOOL isSomethingEnabled;,ios,objective-c,swift,model-view-controller,uiviewcontroller,Ios,Objective C,Swift,Model View Controller,Uiviewcontroller,在ViewControllerA中,您需要告诉它有关ViewControllerB的信息,因此请使用 #import "ViewControllerB.h" #import "ViewControllerB.h" 然后,在要加载视图的位置,例如,didselectRowatinex或某些iAction,在将其推送到导航堆栈之前,需要在ViewControllerB中设置属性 ViewControllerB *viewControllerB

ViewControllerA
中,您需要告诉它有关
ViewControllerB
的信息,因此请使用

 #import "ViewControllerB.h"
 #import "ViewControllerB.h"
然后,在要加载视图的位置,例如,
didselectRowatinex
或某些
iAction
,在将其推送到导航堆栈之前,需要在
ViewControllerB
中设置属性

    ViewControllerB *viewControllerB = [[ViewControllerB alloc] initWithNib:@"ViewControllerB" bundle:nil];
    viewControllerB.isSomethingEnabled = YES;
    [self pushViewController:viewControllerB animated:YES];
这将在
ViewControllerB
中将
isSomethinegabled
设置为
BOOL
YES

使用Segues向前传递数据

如果您使用的是故事板,则最有可能使用segues,并且需要此过程来转发数据。这与上面的类似,但不是在推送视图控制器之前传递数据,而是使用名为

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
因此,要将
BOOL
ViewControllerA
传递到
ViewControllerB
,我们将执行以下操作:

let notebookName = note.notebook.name
  • ViewControllerB.h
    中为
    BOOL

     @property (nonatomic, assign) BOOL isSomethingEnabled;
    
     @property (nonatomic, assign) BOOL isSomethingEnabled;
    
  • ViewControllerA
    中,您需要告诉它关于
    ViewControllerB
    ,因此使用

     #import "ViewControllerB.h"
    
     #import "ViewControllerB.h"
    
  • 在情节提要上创建从
    ViewControllerA
    ViewControllerB
    的序列,并给它一个标识符。在本例中,我们将其称为“showtailsegue”

  • 接下来,我们需要将该方法添加到执行任何segue时调用的
    ViewControllerA
    。因此,我们需要检测调用了哪个segue,然后执行一些操作。在我们的示例中,我们将检查
    “showtailsegue”
    ,如果执行了该操作,我们将把
    BOOL
    值传递给
    ViewControllerB

     -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
         if([segue.identifier isEqualToString:@"showDetailSegue"]){
             ViewControllerB *controller = (ViewControllerB *)segue.destinationViewController;
             controller.isSomethingEnabled = YES;
         }
     }
    
  • 如果将视图嵌入到导航控制器中,则需要将上述方法稍微更改为以下方法

        -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
            if([segue.identifier isEqualToString:@"showDetailSegue"]){
                UINavigationController *navController = (UINavigationController *)segue.destinationViewController;
                ViewControllerB *controller = (ViewControllerB *)navController.topViewController;
                controller.isSomethingEnabled = YES;
            }
        }
    
    这将在
    ViewControllerB
    中将
    isSomethinegabled
    设置为
    BOOL
    YES

    将数据传回

    @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];
    }
    
    要将数据从
    ViewControllerB
    传回
    ViewControllerA
    需要使用协议和委托或块,后者可以用作回调的松耦合机制

    为此,我们将使
    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];
    }
    

    这个问题在堆栈溢出问题上似乎非常流行,所以我想我会尝试给出一个更好的答案,帮助像我这样在iOS世界起步的人

    我希望这个答案足够清楚,让人们能够理解,我没有遗漏任何东西

    向前传递数据

    将数据从另一个视图控制器转发到视图控制器。如果要将对象/值从一个视图控制器传递到另一个视图控制器,则可以使用此方法,该视图控制器可能会推送到导航堆栈

        ViewControllerB *viewControllerB = [[ViewControllerB alloc] initWithNib:@"ViewControllerB" bundle:nil];
        viewControllerB.isSomethingEnabled = YES;
        [self pushViewController:viewControllerB animated:YES];
    
    对于本例,我们将有
    ViewControllerA
    ViewControllerB

     -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
         if([segue.identifier isEqualToString:@"showDetailSegue"]){
             ViewControllerB *controller = (ViewControllerB *)segue.destinationViewController;
             controller.isSomethingEnabled = YES;
         }
     }
    
    要将
    BOOL
    值从
    ViewControllerA
    传递到
    ViewControllerB
    ,我们将执行以下操作

  • ViewControllerB.h
    中为
    BOOL

     @property (nonatomic, assign) BOOL isSomethingEnabled;
    
     @property (nonatomic, assign) BOOL isSomethingEnabled;
    
  • ViewControllerA
    中,您需要告诉它有关
    ViewControllerB
    的信息,因此请使用

     #import "ViewControllerB.h"
    
     #import "ViewControllerB.h"
    
  • 然后,在要加载视图的位置,例如,
    didselectRowatinex
    或某些
    iAction
    ,在将其推送到导航堆栈之前,需要在
    ViewControllerB
    中设置属性

        ViewControllerB *viewControllerB = [[ViewControllerB alloc] initWithNib:@"ViewControllerB" bundle:nil];
        viewControllerB.isSomethingEnabled = YES;
        [self pushViewController:viewControllerB animated:YES];
    
    这将在
    ViewControllerB
    中将
    isSomethinegabled
    设置为
    BOOL
    YES

    使用Segues向前传递数据

    如果您使用的是故事板,则最有可能使用segues,并且需要此过程来转发数据。这与上面的类似,但不是在推送视图控制器之前传递数据,而是使用名为

    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    
    因此,要将
    BOOL
    ViewControllerA
    传递到
    ViewControllerB
    ,我们将执行以下操作:

    let notebookName = note.notebook.name
    
  • 视图控件中
    
    - (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
    }