質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.19%

同じビュー内に違う値を持つPickerViewを2つ表示する

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 354

Daisuke0315

score 12

画像のように年月日と時間をPickerViewで入力できるようなオブジェクトを設置したいと考えています。
イメージ説明

このホームページを参考にしてキーボード入力時にデートピッカーが表示するオブジェクトを設置しました。
https://qiita.com/Takarkiz/items/5b559a63598e3d641c3a

さらに以下のホームページを参考にして、tagをつけて同じビュー内に違う値を持つPickerViewを設置しようとしたところ、出来ませんでした。
https://teratail.com/questions/59982

教えていただきたいこと
①同じビュー内に違う値を持つPickerViewを2つ表示する方法

import UIKit
class testViewController: UIViewController, UITextFieldDelegate{

var toolBar:UIToolbar!


    @IBOutlet weak var wakeTimeTextField: UITextField!

    @IBOutlet weak var textfield2: UITextField!
    override func viewDidLoad() {
    super.viewDidLoad()

    wakeTimeTextField.tag = 1
    wakeTimeTextField.delegate = self
    setupToolbar()

    textfield2.tag = 2
        textfield2.delegate = self
}
func setupToolbar() {
        //datepicker上のtoolbarのdoneボタン
        toolBar = UIToolbar()
        toolBar.sizeToFit()
        let toolBarBtn = UIBarButtonItem(title: "DONE", style: .plain, target: self, action: #selector(doneBtn))
        toolBar.items = [toolBarBtn]
        wakeTimeTextField.inputAccessoryView = toolBar
}

func textFieldDidBeginEditing(_ textField: UITextField) {
    if wakeTimeTextField.tag == 1{
    let datePickerView:UIDatePicker = UIDatePicker()
    datePickerView.datePickerMode = UIDatePicker.Mode.date
    textField.inputView = datePickerView
        datePickerView.addTarget(self, action: #selector(datePickerValueChanged(sender:)), for: UIControl.Event.valueChanged)}else{
        let datePickerView:UIDatePicker = UIDatePicker()
        datePickerView.datePickerMode = UIDatePicker.Mode.time
        textField.inputView = datePickerView
            datePickerView.addTarget(self, action: #selector(datePickerValueChanged(sender:)), for: UIControl.Event.valueChanged)}
}

    //datepickerが選択されたらtextfieldに表示
@objc func datePickerValueChanged(sender:UIDatePicker) {
    if wakeTimeTextField.tag == 1{
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat  = DateFormatter.dateFormat(fromTemplate: "yMMMdE", options: 0, locale: Locale(identifier: "ja_JP"))
        wakeTimeTextField.text = dateFormatter.string(from: sender.date)}else
    {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat  = DateFormatter.dateFormat(fromTemplate: "H:mm", options: 0, locale: Locale(identifier: "ja_JP"))
        textfield2.text = dateFormatter.string(from: sender.date)}
}

//toolbarのdoneボタン
@objc func doneBtn(){
    wakeTimeTextField.resignFirstResponder()
}
}

追記です。

import UIKit
class testViewController: UIViewController, UITextFieldDelegate{

var toolBar:UIToolbar!


    @IBOutlet weak var wakeTimeTextField: UITextField!

    @IBOutlet weak var textfield2: UITextField!
    override func viewDidLoad() {
    super.viewDidLoad()

    wakeTimeTextField.tag = 1
    wakeTimeTextField.delegate = self
    setupToolbar()

    textfield2.tag = 2
        textfield2.delegate = self
}
func setupToolbar() {
        //datepicker上のtoolbarのdoneボタン
        toolBar = UIToolbar()
        toolBar.sizeToFit()
        let toolBarBtn = UIBarButtonItem(title: "DONE", style: .plain, target: self, action: #selector(doneBtn))
        toolBar.items = [toolBarBtn]
        wakeTimeTextField.inputAccessoryView = toolBar
}

func textFieldDidBeginEditing(_ textField: UITextField) {
    if wakeTimeTextField.tag == 1{
    let datePickerView:UIDatePicker = UIDatePicker()

        datePickerView.tag = 1//追加

    datePickerView.datePickerMode = UIDatePicker.Mode.date
    textField.inputView = datePickerView
        datePickerView.addTarget(self, action: #selector(datePickerValueChanged(sender:)), for: UIControl.Event.valueChanged)}else{
        let datePickerView:UIDatePicker = UIDatePicker()

        datePickerView.tag = 2//追加


        datePickerView.datePickerMode = UIDatePicker.Mode.time
        textField.inputView = datePickerView
            datePickerView.addTarget(self, action: #selector(datePickerValueChanged(sender:)), for: UIControl.Event.valueChanged)}
}

    //datepickerが選択されたらtextfieldに表示
@objc func datePickerValueChanged(sender:UIDatePicker) {

    if sender.tag == 1{//変更

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat  = DateFormatter.dateFormat(fromTemplate: "yMMMdE", options: 0, locale: Locale(identifier: "ja_JP"))
        wakeTimeTextField.text = dateFormatter.string(from: sender.date)}else
    {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat  = DateFormatter.dateFormat(fromTemplate: "H:mm", options: 0, locale: Locale(identifier: "ja_JP"))
        textfield2.text = dateFormatter.string(from: sender.date)}
}

//toolbarのdoneボタン
@objc func doneBtn(){
    wakeTimeTextField.resignFirstResponder()
}
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

曜日の漢字名については別の方が解決されることを期待して...

2つのPickerViewを使う方法として、流れは間違っていないと思いますが、tagをうまく活用されていないように思えます。

2つの独立したTextFieldの処理を一つのtextFieldDidBeginEditing()で処理させるのは良いのですが、どのタグから送られてきたのか判別するのは、このメソッドの引数であるtextFieldtagを見る必要があります。

DatePickerの処理の流れも同じです。

func setupToolbar() {
        // 中略
        // 時間を入れるテキストフィールドのアクセサリビューも設定する(共用する)
        textfield2.inputAccessoryView =  toolBar
    }

    func textFieldDidBeginEditing(_ textField: UITextField) {
        // ここは、この関数の引数(textField.tag)を使う
        if textField.tag == 1 {
            let datePickerView:UIDatePicker = UIDatePicker()
            // ここで作成したdatePockerにもタグをつける.
            // 番号はテキストフィールドのtagに合わせる
            datePickerView.tag = 1
            // 略
        } else {
            let datePickerView:UIDatePicker = UIDatePicker()
            // 同じくタグをつける
            datePickerView.tag = 2
            // 略            
     }

        // 上の行はこのようにまとめて処理することも可能
        // let datePickerView: UIDatePicker = UIDatePicker()
        //
        // datePickerView.tag = textField.tag
        // タグの番号によって DataPicker の表示内容を変える
        // datePickerView.datePickerMode = textField.tag == 1 ? .date : .time
        // textField.inputView = datePickerView
        // datePickerView.addTarget(self, action: #selector(datePickerValueChanged(sender:)), for: UIControl.Event.valueChanged)
    }

    //datepickerが選択されたらtextfieldに表示
    @objc func datePickerValueChanged(sender:UIDatePicker) {
        // sender のタグで判断する
        if sender.tag == 1{
            // 略
        } else {
            // 略
        }
    }

    //toolbarのdoneボタン
    @objc func doneBtn(){
        // どちらのテキストフィールドが押された場合でもピッカービューを消す
        view.endEditing(true)
    }

textFieldDidBeginEditing(_)の中はこんな感じになります。

func textFieldDidBeginEditing(_ textField: UITextField) {
        // ここは、この関数の引数を使う
        if textField.tag == 1 {
            let datePickerView:UIDatePicker = UIDatePicker()
            // ここで作成したdatePockerにもタグをつける.
            // 番号はテキストフィールドのtagに合わせる
            datePickerView.tag = 1
            datePickerView.datePickerMode = UIDatePicker.Mode.date
            textField.inputView = datePickerView
            datePickerView.addTarget(self, action: #selector(datePickerValueChanged(sender:)), for: UIControl.Event.valueChanged)
        } else {
            let datePickerView:UIDatePicker = UIDatePicker()
            // 同じくタグをつける
            datePickerView.tag = 2
            datePickerView.datePickerMode = UIDatePicker.Mode.time
            textField.inputView = datePickerView
            datePickerView.addTarget(self, action: #selector(datePickerValueChanged(sender:)), for: UIControl.Event.valueChanged)
        }
    }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/20 18:24

    すみません理解出来ていなかったです。教えていただきありがとうございます。
    しっかり中身を理解出来ていないので噛み砕いて消化していきたいと思います。

    インデントの校正についても知らなかったので今後はしっかり活用して、みやすく拡張性の高いコードを書けるようにしたいと思います。
    今後も質問させていきたいと思っていますので今後ともよろしくおねがいします。

    キャンセル

  • 2020/04/20 18:41

    コメントありがとうございます。
    曜日を漢字にする件が未解決なのにBAをいただくのはちょっと恐縮なのですが...
    この問題が解決済みになってしまって、曜日の問題が他の方から見えなくなるので、曜日の件だけ独立して新たに一つ質問を作られることをお勧めします(コードだけでなく、iPhoneの設定も絡んでくるので、結構難儀するかもしれませんが、解決方法はあるはずです)。

    キャンセル

  • 2020/04/20 20:40

    承知しました。試行錯誤してみます、またわからなければ質問しようと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.19%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る