Swift3でModalViewのDatePickerで取得した時刻データを受け渡す方法
例えば目覚まし時計などのアラート機能を備えたiPhoneアプリを作りたい場合に、別画面であるModalView側でDatePickerを立ち上げて日時情報や時刻情報を取得し、そのデータをメインのViewに受け渡したいという場合があると思いますので、swift3を使った場合におけるその方法を紹介します。
まあ目覚まし時計ならば時刻情報だけで十分なので、日付情報までは取得しないことにします。
具体的には、最初に次のメイン画面が表示される。「0」という初期値が与えられたラベルがある。
次に「set timer」ボタンを押すとdatepickerが呼び出される。そのdatePickerはモーダルビューに乗せられている。
モーダルビューが閉じられると、メイン画面のラベルが選択した時刻で上書きされる。
DatePickerの作成
ModalViewController.swiftをまずは作成して、そこにUIkitをインポートしておきます。
そしてclass ModalViewController: UIViewController{}に以下を記入してdatePickerオブジェクトを作成し、フォーマットも決めておきます。
//ModalViewController.swift class ModalViewController: UIViewController { var datePicker = UIDatePicker() //DatePickerオブジェクト生成 override func viewDidLoad() { dateFormatter.timeStyle = .short //時刻と分のスタイルのフォーマット ... }
次にdatePickerオブジェクトとdateStrオブジェクトを生成して、datePickerで要素が回されるたびにdateStrに時刻情報が更新されていく仕様にします。
// ModalViewController.swift class ModalViewController: UIViewController { var datestr = "" ... override func viewDidLoad() { super.viewDidLoad() ... datePicker.frame = CGRect(x: 0, y: 420, width: screenWidth, height: 250)//適当にdatePickerのサイズを決定 datePicker.datePickerMode = .time//時刻情報だけが選択できるようにする datePicker.setValue(UIColor.white, forKey: "textColor")//datePickerの文字色を決定 datePicker.addTarget(self, action: #selector(updateStr), for: .valueChanged)//回されるたびにupdateStrメソッドが呼ばれるようにする self.view.addSubview(datePicker)//表示 } func updateStr() { datestr = dateFormatter.string(from: self.datePicker.date); } ... }
ViewとViewの間でのデータの受け渡し
さて、こうやって取得できるdatestr内に格納されたstring型の時刻情報。
これをメインのViewController.swiftに移行させたい。
今回はsegueを使っておらず、モーダルからデリゲートを使って直接メインに移行させます。
//ModalViewController.swift import UIKit protocol ModalViewControllerDelegate{ func modalDidFinished(modalText: String) } class ModalViewController: UIViewController { var delegate: ModalViewControllerDelegate?//デリゲートオブジェクト生成 ...
protocol でデリゲートを宣言します。
その際、モーダルビューが消えた時(dismiss)に関数modalDidFinished(modalText: String)が呼び出されるようにします。
また、デリゲートがnil値を取ることがあり、nilの場合にはデータ受け渡し時にエラーが発生する場合があるので、オプショナル型にします。
そして、適当に「Back」ボタンなんかを作っておいて、そのボタンを押したらモーダルビューが閉じるようにしておきます。
その際、ボタンが押されると「returnToStart」メソッドが呼ばれるような仕様にしておき、以下のように記述。
func returnToStart() { delegate?.modalDidFinished(modalText: datestr)//datestrが受け渡される引数に設定される }
次にメインのViewController.swiftで、モーダルビューを呼び出すことを宣言しておきます。
//ViewController.swift import UIKit class ViewController: UIViewController, ModalViewControllerDelegate {//ModalViewControllerDelegateを追加 ... let modalView = ModalViewController()//ModalViewControllerオブジェクトを生成 func setTimer() {//メイン画面で所定のボタンを押して「setTimer」が呼ばれるようにし、その際にモーダルビューが呼び出されるようにします。 modalView.delegate = self//メイン画面がデリゲートであることを宣言 modalView.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext // モーダルビューの背景の透過の設定 self.present(modalView, animated: true, completion: nil)//モーダルビューを呼び出す } func modalDidFinished(modalText: String){//モーダルビューが閉じられる時に呼ばれるメソッド alartLbl.text = modalText//modalText(datestrの文字列が格納されている)が、メイン画面の適当なラベルに表示されるようにする。 self.modalView.dismiss(animated: true, completion: nil)//モーダルビューが消える }
モーダルビューからのデータの受け渡し方法がわかれば、結構いろんなアプリが作れて楽しめると思います。