代码之家  ›  专栏  ›  技术社区  ›  Ram

从一个视图控制器向多个视图控制器发送“StringValue”的可能方法?

  •  0
  • Ram  · 技术社区  · 7 年前

    我正在尝试创建一个可重用的日期选择器。在我的项目中,我在多个ViewController中使用多个标签。为此,我创建了一个DatePicker类,我在不同的地方使用它。检查以下代码是否适用于单个viewController。 这是我在这里显示日期的一个VC,我从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
            }
    
        }
    

    这是我的CustomDatePickerViewController类。

    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()
                }
            });
        }
    
    }
    

    我可以将所选日期从CustomDatePickerViewController发送到SelectDateViewController,但如何将所选日期发送到不同的视图控制器。

    4 回复  |  直到 7 年前
        1
  •  3
  •   Bence Pattogato    7 年前

    发送通知可能是一种解决方案,但我认为从架构的角度来看,这要好得多(更易于维护和扩展等)。 例如,使用观察者(多个代理)模式。创建这样的协议。实施后,考虑 this 用于解析阵列的保留周期。

    protocol DatePickerProtocol {
        func dateStringChanged(to newString: String)
    }
    
    class CustomDatePickerViewController: UIViewController {
        ...
        var delegates: [DatePickerProtocol]?
    
        @IBAction func saveDateAction(_ sender: Any) {
            .....
            if let delegates {
                for delegate in delegates {
                    delegate.dateStringChanged(to: "selectedDate string")
                }
            }
            ...
        }
    }
    
    class SelectDateViewController: UIViewController, DatePickerProtocol {
        ...
        // get a reference to CustomDatePickerViewController and register this class like:
        dataPickerViewController.delegates.append(self)
    
        func dateStringChanged(to newString: String) {
            // Do whatever with the new date string
        }
    }
    
        2
  •  0
  •   Agent Smith    7 年前

    你可以开一个 通知 具有 通知中心 您可以在viewController中添加观察者并更新标签。

    当您想要发送日期时,可以发布如下通知:

    NotificationCenter.default.post(name: "SelectedDate", object: nil, userInfo: ["selectedDate": Date that you selected])
    

    之后,您可以在另一个viewController中添加观察者,以便接收该通知。

    NotificationCenter.default.addObserver(self, selector: #selector(datePicked(notification:)), name: "SelectedDate", object: nil)
    
    
    @objc func datePicked(notification: Notification) {
          //get the date here
          print(notification.userInfo?["selectedDate"])
    }
    
        3
  •  0
  •   Ram    7 年前

    最后,我采纳了@Bence Pattogato的建议,解决了我的问题。请参阅以下更新的代码。

    我创建了一个协议类。文件名为CustomDatePickerDelegate。敏捷的

    protocol CustomDatePickerDelegate {
            func CustomDateSeletced(value: String)
    }
    

    现在,这是我在CustomDatePickerViewController类中更新的代码。

    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()
                }
            });
        }
    
    }
    

    现在,我在SelectDateViewController中使用此委托。请参阅以下更新的代码。

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

    代码清理目的我正在使用那边的扩展。

        4
  •  -2
  •   Jake    7 年前

    创建 DataSource 并在您需要的视图中阅读它们:

    class DateDataSource {
        var date : Date?
        static let sharedInstance = DateDataSource()
        private init() {}
    }
    

    当您从选取器中获取日期时,您会将其设置为:

    DateDataSouce.sharedInstance.date = theDate

    然后在需要显示它的视图中,您将调用

    let theDate = DateDataSouce.sharedInstance.date