ダーヤス.com プレミアム

ダーヤス.comにようこそ。プレミアムな情報で、ワークライフバランスの充実を図りませんか。

Swift3でModalViewのDatePickerで取得した時刻データを受け渡す方法

   

例えば目覚まし時計などのアラート機能を備えたiPhoneアプリを作りたい場合に、別画面であるModalView側でDatePickerを立ち上げて日時情報や時刻情報を取得し、そのデータをメインのViewに受け渡したいという場合があると思いますので、swift3を使った場合におけるその方法を紹介します。

まあ目覚まし時計ならば時刻情報だけで十分なので、日付情報までは取得しないことにします。

具体的には、最初に次のメイン画面が表示される。「0」という初期値が与えられたラベルがある。

Swift3でModalViewのDatePickerで取得した時刻データを受け渡す方法

次に「set timer」ボタンを押すとdatepickerが呼び出される。そのdatePickerはモーダルビューに乗せられている。

Swift3でModalViewのDatePickerで取得した時刻データを受け渡す方法

モーダルビューが閉じられると、メイン画面のラベルが選択した時刻で上書きされる。

Swift3でModalViewの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)//モーダルビューが消える
    }

モーダルビューからのデータの受け渡し方法がわかれば、結構いろんなアプリが作れて楽しめると思います。

 - アプリ開発