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

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

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

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

Swift

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

Q&A

解決済

1回答

665閲覧

UITableviewCellをタップして時間を設定したい

pftyuk

総合スコア52

iOS

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

Swift

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

0グッド

0クリップ

投稿2018/08/09 05:21

編集2018/08/10 13:51

いつもお世話になっております。

前提・実現したいこと

ユーザーに時間を設定させて、設定した時間をTableViewCellのラベルに表示させたいです。

UITableViewのセルをタップするとUIDatePickerが画面下部に表示され(ソフトウェアキーボードみたいなイメージ)
設定完了のボタンを押すとUIDatePickerが閉じて設定した時間がタップしたUITableViewCellの
ラベルに表示するような実装を行いたいのですが、方法がわかりませんでした。

どなたかご教示頂けると幸いです。

追記
イメージの画像を追加しました

試したこと

全くわからなかったので取り敢えず下記を試してみましたが
取り敢えず画面上部にPickerは出ましたが完了のボタンを設置する必要もあれば
そのボタンを押したら閉じる必要もありますが方法が全くわかりませんでした。

Swift

1class AlarmViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 2 @IBOutlet weak var tableView: UITableView! 3 4 var cellItems = [ ["前日", "当日"]] 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 9 tableView.delegate = self 10 tableView.dataSource = self 11 12 if let path: String = Bundle.main.path(forResource: "test", ofType: "json") { 13 let fileHandle : FileHandle = FileHandle(forReadingAtPath: path)! 14 let data : Data = fileHandle.readDataToEndOfFile() 15 16 do { 17 let json = try JSON(data: data) 18 let town = json["Town"][0] 19 let trashInfo = town["TrashInfo"] 20 21 var trashKindArray = [String]() 22 for (_,subJson):(String, JSON) in trashInfo { 23 for (key,_):(String, JSON) in subJson { 24 trashKindArray.append(key) 25 } 26 } 27 cellItems.append(trashKindArray) 28 } catch { 29 print("ファイルの内容取得時に失敗") 30 } 31 }else { 32 print("指定されたファイルが見つかりません") 33 } 34 } 35 36 override func didReceiveMemoryWarning() { 37 super.didReceiveMemoryWarning() 38 } 39 40 func numberOfSections(in tableView: UITableView) -> Int { 41 return cellItems.count 42 } 43 44 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 45 return cellItems[section].count 46 } 47 48 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 49 switch indexPath.section{ 50 case 0: 51 let cell = tableView.dequeueReusableCell(withIdentifier: "AlarmTimeCell", for: indexPath) as! AlarmTableViewCell 52 cell.textLabel?.text = cellItems[indexPath.section][indexPath.row] 53 cell.timeLabel.text = "ここに時間を入れたい" 54 55 return cell 56 case 1: 57 let cell = tableView.dequeueReusableCell(withIdentifier: "AlarmSwitchCell", for: indexPath) 58 cell.textLabel?.text = cellItems[indexPath.section][indexPath.row] 59 60 if cell.accessoryView == nil { 61 cell.accessoryView = UISwitch() 62 } 63 64 return cell 65 default: 66 return tableView.dequeueReusableCell(withIdentifier: "AlarmTimeCell", for: indexPath) 67 } 68 } 69 70 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 71 tableView.deselectRow(at: indexPath, animated: true) 72 } 73}
class AlarmTableViewCell: UITableViewCell { @IBOutlet weak var timeLabel: UILabel! override func awakeFromNib() { super.awakeFromNib() } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) } }

イメージ画像

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

自分ならCustomPickerView.xibと対応するCustomPickerView.swift、そしてCustomPickerのContainer用の.swiftファイルを作成。CustomPickerView.xibにUIDatePickerとUIToolBar, BarButtonItem載せてBarButtonItemをIBActionで接続、そのBarButtonItemをタップするとUIDatePickerの日付を取得してそれを任意のCellに書き込む、って方法を取りますかね。

手前味噌ですが.xibファイルの作り方です。参考程度に。CustomPickerView.xibではFile'sOwnerではなくViewのCustomClassにCustomPickerViewを選択します。

https://teratail.com/questions/100469

あとはこんなやり方も

【swift】UIDatePickerを作ってみる(日付選択ドラムロール)

追記

customCellが作れるのであればunwind時に、つまりTableViewControllerに戻るときにlabel.textを埋める関数を呼び出せばいいです。

これはUITableViewをDynamic Prototypesで、なおかつUITableViewCellの中に置くTextをUILabelでやっています。ちなみにTableViewのUIが固定であればStatic Cellsを使って、なおかつUILabelにこだわりが無ければ(つまりUITextFieldを使えば)1/4の時間で出来上がります(というか出来上がった)。

Storyboard上でいくつか設定があります。多分先にコードを読んだ方がいいでしょう。

まずTableViewControllerとは別にViewControllerを配置。そのViewControllerにDatePickerとToolBarを配置、適切なConstraintsを設定。

各ViewControllerのCustomClassを設定。

TableViewController上の任意のCellのCustomClassをCustomCellに設定。

CustomClassがPickerViewControllerであるViewControllerのAttributes Inspector内にあるPresentationをOver Current Contextに設定。

unwindの設定。

以下コード
CustomCell.swift

swift

1import UIKit 2 3class CustomCell: UITableViewCell { 4 5 @IBOutlet var dateLabel: UILabel! 6 override func awakeFromNib() { 7 super.awakeFromNib() 8 } 9 10 override func setSelected(_ selected: Bool, animated: Bool) { 11 super.setSelected(selected, animated: animated) 12 } 13 14 func fill(with text: String) { 15 dateLabel.text = text 16 } 17 18}

PickerViewController.swift

swift

1import UIKit 2 3class PickerViewController: UIViewController { 4 5 @IBOutlet var datePicker: UIDatePicker! 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 } 10 11 override func didReceiveMemoryWarning() { 12 super.didReceiveMemoryWarning() 13 } 14 15}

TableViewController.swift

swift

1 2import UIKit 3 4class TableViewController: UITableViewController { 5 6 @IBAction func unwind(segue: UIStoryboardSegue) { 7 guard let source = segue.source as? PickerViewController else { 8 fatalError() 9 } 10 let date = source.datePicker.date 11 guard let indexPath = tableView.indexPathForSelectedRow else { 12 fatalError() 13 } 14 tableView.deselectRow(at: indexPath, animated: true) 15 guard let cell = tableView.cellForRow(at: indexPath) as? CustomCell else { 16 fatalError() 17 } 18 19 20 cell.fill(with: date.description) 21 } 22 23 override func viewDidLoad() { 24 super.viewDidLoad() 25 } 26 27 override func didReceiveMemoryWarning() { 28 super.didReceiveMemoryWarning() 29 } 30 31 // MARK: - Table view data source 32 33 override func numberOfSections(in tableView: UITableView) -> Int { 34 return 3 35 } 36 37 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 38 return 2 39 } 40 41 42 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 43 44 switch indexPath { 45 case IndexPath(row: 0, section: 0): 46 guard let cell = tableView.dequeueReusableCell(withIdentifier: "CUSTOMCELL", for: IndexPath(row: 0, section: 0)) as? CustomCell else { 47 fatalError() 48 } 49 return cell 50 default: 51 guard let cell = tableView.dequeueReusableCell(withIdentifier: "NORMALCELL") else { 52 fatalError() 53 } 54 return cell 55 } 56 57 } 58 59} 60

投稿2018/08/09 05:38

編集2018/08/11 05:56
xAxis

総合スコア1349

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

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

pftyuk

2018/08/09 05:46

ご回答頂きありがとうございます。 参考URLありがとうございます。 確認してみましたが、1点教えて下さい。 リンク先はtextFieldでやっておりますが cellの中にlabelではなくtextFieldを配置して同様の処理を書く感じでしょうか? UILabelでは出来ないでしょうか?
xAxis

2018/08/09 05:56

追記があったのですね、今確認しました。 このTableViewの感じだとStatic Cellsなのかな? UILabelであろうとUITextFieldであろうとやることの流れはほぼ変わらないですよ。 書き込み先がUITextFieldではなくUILabelなだけです。 なのでUILabelを配置しちゃっても問題ないです。
pftyuk

2018/08/09 06:10

失礼致しました。 追記は参考にしているアプリのスクショです。 初心者なのでちょっと飲み込めてないのですが // インプットビュー設定 textField.inputView = datePicker textField.inputAccessoryView = toolbar リンク先の上記の部分はどのように書き換えれば宜しいでしょうか・・・。 リンク先はStoryBoard上のtextFieldを接続して色々書いてますが tableViewの場合はどのように書いたら良いのかがわかりません・・・。 恐縮ですがご教示頂けると幸いです。
xAxis

2018/08/09 07:10

この画像を参考にしてるってことはそもそもこのUIは出来ていない、っていうことですか?
pftyuk

2018/08/09 07:49

言葉足らずでした。 このUIは出来ていません。 日付を選択させる部分(下部)を画像のイメージで作りたくて追記で貼らせて頂きました。
xAxis

2018/08/10 01:35

うーん、UIができていないのなら追加の質問に答えたいのですが先に確認させてください。TableViewのコードの書き方、それとCustomCellの作り方は分かりますか?
pftyuk

2018/08/10 13:59

返信遅くなり申し訳ございません。 失礼しましたこちらが勘違いしていました。 このUIが指すものはカスタムセルを使ったUITableviewのレイアウトのことですよね失礼しました。 TableViewのコードの書き方、CustomCellの作り方は分かります。 つたないコードですが、質問欄のコードの部分を編集して 該当画面のViewControllerとカスタムセルのクラスのコードを 貼らせて頂きましたので、ご確認頂けると幸いです。 具体的には今tableViewが2つのセクションに別れているのですが 1つ目のセクションのセルをタップしたときにUIDatePickerを表示させて 選択した時間をtimeLabel.textに反映させる処理を実装したいです。 宜しくお願い致します。
xAxis

2018/08/11 06:07

色々と黙っていましたが、コードは最初に貼りましょう。どこまで分かっていてどこまで分かっていないのかが分らないと非常に回答に苦しみます。またStatic Cellsなのかどうか聞いていますが返答がないのも良くないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問