同じビュー内に違う値を持つPickerViewを2つ表示する
- 評価
- クリップ 0
- VIEW 354
画像のように年月日と時間を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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
曜日の漢字名については別の方が解決されることを期待して...
2つのPickerView
を使う方法として、流れは間違っていないと思いますが、tag
をうまく活用されていないように思えます。
2つの独立したTextField
の処理を一つのtextFieldDidBeginEditing()
で処理させるのは良いのですが、どのタグから送られてきたのか判別するのは、このメソッドの引数であるtextField
のtag
を見る必要があります。
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)
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.19%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2020/04/20 17:44
取り急ぎコードの追加・変更などしてみたのですが現象はかわりませんでした。他になにか原因があるのでしょうか・・・。
私のケアレスミスの可能性もあるため、コードを追記します。ご査収よろしくおねがいします。
2020/04/20 17:56
私の例がちょっとわかりにくかったかもしれません。
省略していないバージョンを回答に追記していますので、そちらとよく見比べてみてください。
ところで、Swiftはインデントそのものは動作にほとんど関係しませんが、それでも目で見える範囲で間違いに気づくためにはインデントすることは重要だと思っています。
提示していただいたコードはインデントが崩れているため、すぐに間違いに気付きにくくなっています。
インデントを整えたい部分をドラッグして(範囲指定して)Control+I を押すか、それとも Cmd+A(全部選択)のあと Control+I を押すとインデントを自動で修正してくれますので、是非その機能も活用してみてください。
2020/04/20 18:24
しっかり中身を理解出来ていないので噛み砕いて消化していきたいと思います。
インデントの校正についても知らなかったので今後はしっかり活用して、みやすく拡張性の高いコードを書けるようにしたいと思います。
今後も質問させていきたいと思っていますので今後ともよろしくおねがいします。
2020/04/20 18:41
曜日を漢字にする件が未解決なのにBAをいただくのはちょっと恐縮なのですが...
この問題が解決済みになってしまって、曜日の問題が他の方から見えなくなるので、曜日の件だけ独立して新たに一つ質問を作られることをお勧めします(コードだけでなく、iPhoneの設定も絡んでくるので、結構難儀するかもしれませんが、解決方法はあるはずです)。
2020/04/20 20:40