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

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

ただいまの
回答率

88.21%

【Swift】TabelViewCellのDetailLabelに値を反映させたい

解決済

回答 1

投稿

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

duck015

score 29

前提・実現したいこと

SwiftでToDoアプリを作成しています。
TableViewの「日付」CellをタップするとUIDatePickerを表示するようにしています。
今回は、Toolbarの「完了」ボタンをタップしたら、CellのDetailLabelに選択した日付を表示させたいです。

実現させるためには、doneButtonTapped()関数内にその処理を書けばよいと考えています。
ただ、その際にどのようにして選択したCellのdetailLabelに値を渡せばよいのか分からず、解決策ご教示いただけませんでしょうか?

イメージ説明

該当のソースコード

import UIKit

class AddTaskViewController: UIViewController {

    @IBOutlet weak var largeTitleBackgroundView: UIView!
    @IBOutlet weak var addTaskTableView: UITableView!

    let titleLabelArray = ["", "カテゴリ", "日付"]

    var detailLabelArray: [String] = []

    let datePicker = UIDatePicker()

    let datePickerView = UIView()

    override func viewDidLoad() {
        super.viewDidLoad()
        largeTitleBackgroundView.layer.addShadow()
        initializeTableView()
        detailLabelArray = ["", "カテゴリ", getToday()]
    }

    func getToday(format:String = "M月dd日") -> String {
        let now = Date()
        let formatter = DateFormatter()
        formatter.dateFormat = format
        return formatter.string(from: now)
    }

    private func initializeTableView() {
        addTaskTableView.delegate = self
        addTaskTableView.dataSource = self
        addTaskTableView.backgroundColor = UIColor(red: 250, green: 250, blue: 250, alpha: 1.0)
        addTaskTableView.register(UINib(nibName: "TaskTitleTableViewCell", bundle: nil), forCellReuseIdentifier: "TaskTitleTableViewCell")
    }

    @objc private func doneButtonTapped() {
        let formatter = DateFormatter()
        formatter.dateFormat = "M月dd日"
        print("\(formatter.string(from: datePicker.date))")
        datePickerView.removeFromSuperview()
    }

    private func showDatePicker() {
        datePicker.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: datePicker.bounds.size.height)
        datePicker.datePickerMode = UIDatePicker.Mode.date
        datePicker.timeZone = NSTimeZone.local
        datePicker.locale = NSLocale(localeIdentifier: "ja_JP") as Locale
        datePickerView.frame = datePicker.bounds
        let toolbar = UIToolbar()
        let spaceItem = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil)
        let doneItem = UIBarButtonItem(title: "完了", style: .plain, target: self, action: #selector(doneButtonTapped))
        toolbar.setItems([spaceItem, doneItem], animated: true)
        toolbar.sizeToFit()
        datePickerView.addSubview(datePicker)
        datePickerView.addSubview(toolbar)
        view.addSubview(datePickerView)
        let screenSize = UIScreen.main.bounds.size
        datePickerView.frame.origin.y = screenSize.height
        UIView.animate(withDuration: 0.3) {
            self.datePickerView.frame.origin.y = screenSize.height - self.datePickerView.bounds.size.height
        }
    }
}

extension AddTaskViewController: UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 3
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "addCell", for: indexPath)
        let taskTitleCell = addTaskTableView.dequeueReusableCell(withIdentifier: "TaskTitleTableViewCell", for: indexPath) as! TaskTitleTableViewCell
        if indexPath.section == 0 && indexPath.row == 0 {
            return taskTitleCell
        }
        cell.textLabel?.text = titleLabelArray[indexPath.row]
        cell.detailTextLabel?.text = detailLabelArray[indexPath.row]
        return cell
    }

    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return CGFloat.leastNormalMagnitude
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        addTaskTableView.deselectRow(at: indexPath, animated: true)
        switch indexPath.row {
        case 0:
            return
        case 1:
            return
        case 2:
            showDatePicker()
        default:
            return
        }
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

いずれ選択した日付を覚えておく必要があるので、detailLabelArray[2]を直接書き換えてはどうでしょうか。

@objc private func doneButtonTapped() {
    let formatter = DateFormatter()
    formatter.dateFormat = "M月dd日"
    print("\(formatter.string(from: datePicker.date))")
    datePickerView.removeFromSuperview()
    // 以下の二行を追加
    detailLabelArray[2] = formatter.string(from: datePicker.date)
    addTaskTableView.reloadData()
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/03/15 22:48

    なるほど!その方法は考え付かなかったです。
    意図した通りに実装することができました。ありがとうございました!

    キャンセル

  • 2020/03/16 08:47

    解決してよかったです。

    余談ですが、同じことをおこなうのであれば、Eurekaというパッケージがやりやすいかもしれません。
    独特の記法ですが、tableViewを使った各種設定がやりやすくなっている点がいいかもしれません。

    https://eurekacommunity.github.io/
    https://github.com/xmartlabs/Eureka

    キャンセル

  • 2020/03/16 11:30

    Eurekaは初めて聞きました。たしかにとてもtableView使いすくなってそうですね。
    ちょっと使い方調べてみたいと思います。
    参考になりました、ありがとうございます!

    キャンセル

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

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

関連した質問

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