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

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

新規登録して質問してみよう
ただいま回答率
85.35%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

986閲覧

TableViewCell クリックで別ファイルで指定している DatePicker を立ち上げたい

unagimochimochi

総合スコア7

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/06/17 01:20

初めて利用させていただきます。
2ヶ月前からネットの情報を頼りにSwiftを触りはじめました。
質問に至らぬ点があるかもしれませんが、どうぞよろしくお願いいたします。

前提・実現したいこと

一番上の「日時」のTableViewCellをクリックしたら、別ファイルで指定しているDatePickerを立ち上げて日時を入力し、セルに表示したい。
現在はTextFieldに出力していますが、枠線が気になるのでこれを非表示にするか、セルに直接表示する方法があれば合わせて教えていただきたいです。

DatePickerはこちらのサイトを参考に記述しました。

「予定を登録」画面

発生している問題

現在はTableViewCell内のTextFieldをクリックするとDatePickerが立ち上がり、日時を指定してDoneでTextFieldに出力されます。

TextFieldクリックでDatePickerが立ち上がる

ViewControllerとは別のTableViewCellのファイルでDatePickerを指定しており、どのようなコードを書けばいいのかわからなくなってしまいました。
そもそも、コードのどの部分がDatePickerの立ち上がりを指定しているのかも把握できておりません。

該当のソースコード

AddPlanViewController.Swift

Swift

1import UIKit 2 3class AddPlanViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 4 5 // キャンセルボタン 6 @IBAction func cancelButton(_ sender: Any) { 7 self.dismiss(animated: true, completion: nil) 8 } 9 10 var planItem = ["日時","参加者","場所","共有開始","通知"] 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 15 // タイトル文字列の設定 16 self.navigationItem.title = "予定を追加" 17 } 18 19 func tableView(_ tableView: UITableView, cellForRowAt indexPath:IndexPath) -> UITableViewCell { 20 var cell: UITableViewCell 21 if indexPath.row == 0 { 22 cell = tableView.dequeueReusableCell(withIdentifier: "DateAndTimeCell", for:indexPath) as UITableViewCell 23 24 } else { 25 cell = tableView.dequeueReusableCell(withIdentifier: "ParticipantCell", for:indexPath) as UITableViewCell 26 } 27 cell.textLabel?.text = planItem[indexPath.row] 28 return cell 29 } 30 31 func tableView(_ tableView: UITableView, numberOfRowsInSection section:Int) -> Int { 32 return planItem.count 33 } 34 35 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 36 print("(indexPath.row)番セルをタップ") 37 tableView.deselectRow(at: indexPath, animated: true) // セルの選択を解除 38 39 if indexPath.row == 0 { 40 // 0番セル(日時)クリックで DatePicker を表示したい 41 } 42 } 43}
DateAndTimeCell.Swift

こちらでセル内のTextFieldを紐付け、Datepickerの指定もしています。

Swift

1import UIKit 2 3class DateAndTimeCell: UITableViewCell { 4 @IBOutlet weak var displayDateAndTime: UITextField! 5 var datePicker: UIDatePicker = UIDatePicker() 6 7 override func awakeFromNib() { 8 super.awakeFromNib() 9 10 // ピッカー設定 11 datePicker.datePickerMode = UIDatePicker.Mode.dateAndTime 12 datePicker.timeZone = NSTimeZone.local 13 datePicker.locale = Locale.current 14 displayDateAndTime.inputView = datePicker 15 16 // 決定バーの生成 17 let toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 40)) 18 let spacelItem = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil) 19 let doneItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(done)) 20 toolbar.setItems([spacelItem, doneItem], animated: true) 21 22 // インプットビュー設定(紐づいているUITextfieldへ代入) 23 displayDateAndTime.inputView = datePicker 24 displayDateAndTime.inputAccessoryView = toolbar 25 } 26 27 @objc func done() { 28 displayDateAndTime.endEditing(true) 29 30 // 日付のフォーマット 31 let formatter = DateFormatter() 32 33 //日本仕様で日付の出力 34 formatter.timeStyle = .short 35 formatter.dateStyle = .full 36 formatter.locale = Locale(identifier: "ja_JP") 37 38 //datePickerで指定した日付が表示される 39 displayDateAndTime.text = "(formatter.string(from: datePicker.date))" 40 } 41 42 override func setSelected(_ selected: Bool, animated: Bool) { 43 super.setSelected(selected, animated: animated) 44 } 45}

試したこと

didSelectRowAt部分をいじってみましたが、何をすればいいかわからず断念しました。

補足情報(FW/ツールのバージョンなど)

Xcode Version 10.1

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

0番セルをクリックされた場合の条件分けまでは済んでいるので、そこで該当するセルに乗せられているTextView を firstResponder にすれば、セルをクリックした場合も TextField で入力できるようになります。

Swift

1func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 2 print("(indexPath.row)番セルをタップ") 3 tableView.deselectRow(at: indexPath, animated: true) // セルの選択を解除 4 5 if indexPath.row == 0 { 6 // 0番セル(日時)クリックで DatePicker を表示したい 7 if let cell = tableView.cellForRow(at: indexPath) as? DateAndTimeCell{ 8 cell.displayDateAndTime.becomeFirstResponder() 9 } 10 } else { 11 // 0番セル以外をクリックしたらキーボードを閉じる 12 view.endEditing(true) 13 } 14 }

ただし、tableView(_:didSelectRowAt:)が呼ばれた段階では、indexPathは分かっても具体的なインスタンスはわからないので、cellForRow(at:)を使って具体的なインスタンスを調べます。

そのとき、クラスDateAndTimeCellでダウンキャストを行い、成功したら具体的にテキストフィールドに該当するプロパティ(displayDateAndTime)のメソッド(becomeFirstResponder())を呼び出しています。

また、0番セル以外がクリックした場合には、キーボードを閉じるような処理を追加してみました。この処理は他のセルでも入力処理を行うようになった場合には記述も変わってくると思いますので、必要に応じて調整していただけますでしょうか。

また、TextFiledの枠線を消したい場合には

Swift

1class DateAndTimeCell: UITableViewCell { 2 @IBOutlet weak var displayDateAndTime: UITextField! 3 // 中略 4 5 override func awakeFromNib() { 6 // 中略 7 8 // MARK: 9 displayDateAndTime.borderStyle = .none 10 }

という具合に該当するプロパティに.noneを指定するか、あるいはStoryBoard上のAttributes Inspectorにも同じような設定項目がありますから、そちらで設定すると消すことが可能です。

そもそも、コードのどの部分がDatePickerの立ち上がりを指定しているのかも把握できておりません。

Swift

1 // インプットビュー設定(紐づいているUITextfieldへ代入) 2 displayDateAndTime.inputView = datePicker

この部分ですね。

投稿2020/06/17 08:17

TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unagimochimochi

2020/06/17 09:56

ご回答ありがとうございます。 無事、セルをクリックしたらDatePickerが立ち上がるようになりました。 詳しい解説までしてくださり助かりました。 TextFieldの枠線はStoryBoardの設定項目でも消せたのですね。確認すべきでした。 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問