Search code examples
iosswiftdatepickeruinavigationcontroller

Possible ways to send "StringValue" from One View Controller to multiple ViewControllers?


i am trying to create one reusable datePicker. in my project i am using multiple Labels in multiple viewControllers. For that i created one DatePicker class that one i am using different places. check this below code its working for Single viewController. This is the one VC i am displaying date here which i have selected date from CustomDatePickerViewController.

import UIKit

class SelectDateViewController: UIViewController {
    var dateString_fromCustomVC = String()

    override func viewDidLoad() {
        super.viewDidLoad()
        print("dateString_fromCustomVC",dateString_fromCustomVC)

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    @IBAction func selectDateAction(_ sender: Any) {

        let popOverVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "CustomDatePickerViewController") as! CustomDatePickerViewController


        self.addChildViewController(popOverVC)
        self.view.addSubview(popOverVC.view)
        popOverVC.view.frame = view.bounds
        popOverVC.didMove(toParentViewController: self)

        self.navigationController?.navigationBar.isHidden = true
    }

} i am displaying date

    import UIKit

    class SelectDateViewController: UIViewController {
        var dateString_fromCustomVC = String()

        override func viewDidLoad() {
            super.viewDidLoad()
            print("dateString_fromCustomVC",dateString_fromCustomVC)

        }

        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }


        @IBAction func selectDateAction(_ sender: Any) {

            let popOverVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "CustomDatePickerViewController") as! CustomDatePickerViewController


            self.addChildViewController(popOverVC)
            self.view.addSubview(popOverVC.view)
            popOverVC.view.frame = view.bounds
            popOverVC.didMove(toParentViewController: self)

            self.navigationController?.navigationBar.isHidden = true
        }

    }

This is my CustomDatePickerViewController class.

import UIKit

class CustomDatePickerViewController: UIViewController {

    @IBOutlet var myDatePicker: UIDatePicker!
    override func viewDidLoad() {
        super.viewDidLoad()

        view.frame.size.height =  UIScreen.main.bounds.height
        self.view.backgroundColor = UIColor.black.withAlphaComponent(0.6)
    }

    @IBAction func saveDateAction(_ sender: Any) {

        myDatePicker.datePickerMode = UIDatePickerMode.date
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "dd MMM yyyy"
        let selectedDate = dateFormatter.string(from: myDatePicker.date)
        print("selectedDate",selectedDate)

         let popOverVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SelectDateViewController") as! SelectDateViewController
        popOverVC.dateString_fromCustomVC = selectedDate


        self.removeAnimate()
        self.navigationController?.navigationBar.isHidden = false

    }
    func showAnimate()
    {
        self.view.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
        self.view.alpha = 0.0;
        UIView.animate(withDuration: 0.10, animations: {
            self.view.alpha = 1.0
            self.view.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
        });
    }

    func removeAnimate()
    {
        UIView.animate(withDuration: 0.05, animations: {
            self.view.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
            self.view.alpha = 0.0;
        }, completion:{(finished : Bool)  in
            if (finished)
            {
                self.view.removeFromSuperview()
            }
        });
    }

}

i can able to send selected date from CustomDatePickerViewController to SelectDateViewController, But how to send selected date to different view controllers.


Solution

  • Finally i resolved my problem by taking @ Bence Pattogato suggestions. see my following updated code.

    i created one protocol class . file name is CustomDatePickerDelegate.swift

    protocol CustomDatePickerDelegate {
            func CustomDateSeletced(value: String)
    }
    

    now this is my updated code in CustomDatePickerViewController class.

    import UIKit
    
    class CustomDatePickerViewController: UIViewController {
    
    
        @IBOutlet var myDatePicker: UIDatePicker!
        var delegate: CustomDatePickerDelegate?
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            view.frame.size.height =  UIScreen.main.bounds.height
            self.view.backgroundColor = UIColor.black.withAlphaComponent(0.6)
        }
    
    
        @IBAction func saveDateAction(_ sender: Any) {
    
            myDatePicker.datePickerMode = UIDatePickerMode.date
            let dateFormatter = DateFormatter()
            dateFormatter.dateFormat = "dd MMM yyyy"
            let saveDate = dateFormatter.string(from: myDatePicker.date)
            print("selectedDate",saveDate)
            delegate?.CustomDateSeletced(value: saveDate) **//This is the way i am saving date value  from date picker**
            self.removeAnimate()
            self.navigationController?.navigationBar.isHidden = false
    
        }
        func showAnimate()
        {
            self.view.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
            self.view.alpha = 0.0;
            UIView.animate(withDuration: 0.10, animations: {
                self.view.alpha = 1.0
                self.view.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
            });
        }
    
        func removeAnimate()
        {
            UIView.animate(withDuration: 0.05, animations: {
                self.view.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
                self.view.alpha = 0.0;
            }, completion:{(finished : Bool)  in
                if (finished)
                {
                    self.view.removeFromSuperview()
                }
            });
        }
    
    }
    

    now i am using this delegate in SelectDateViewController. see my following updated code.

      import UIKit
    
    class SelectDateViewController: UIViewController {
    
        @IBOutlet var selectedDateLabel: UILabel!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
        }
        @IBAction func selectDateAction(_ sender: Any) {
    
            let popOverVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "CustomDatePickerViewController") as! CustomDatePickerViewController
            self.addChildViewController(popOverVC)
            self.view.addSubview(popOverVC.view)
            popOverVC.view.frame = view.bounds
            popOverVC.delegate = self
            popOverVC.didMove(toParentViewController: self)
    
            self.navigationController?.navigationBar.isHidden = true
        }
    }
    extension SelectDateViewController:CustomDatePickerDelegate
    {
        func CustomDateSeletced(value: String) {
            selectedDateLabel.text = value
        }    
    }
    

    code clean purpose i am using extension over there.