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.
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.