基本コピペの開発記録

業務&趣味で行うプログラミング記録。基本独学なので、開発はコピペしてからの改変。同じような境遇の方の役に立てば♪ ざっくりとした解説しかしていないので、需要があればご質問・コード出します!

【TODOアプリ】tableViewの複数セクション化 その2

やっと本番用のプロジェクトに実装が完了!

このアプリの中の難所TOP3には入ってるな。。。

 

 

やろうとしたこと

TODOの完了したタスクを一覧表示でなく、セクション(今日・昨日・一昨日など)で表示をさせたかった。

 

①TableViewを複数セクションに対応させる

 

TableViewがセクション表示に対応していることすら知らないときに、
【TableView 複数 表示】と検索して出てきたページ。

もともとは、Viewの中にTableViewを複数storyboard上に並べて、無理やり分けようとしてたもんね。

f:id:t2mdev:20180516233414p:plain

※質問に答えていただいサイト管理人さんありがとうございました。

 

怪我の功名で、全てtableViewコードで書く方法が勉強になったので良しとしよう。。

[Swift] storyboardを使わず、テーブルを表示させる短いサンプル(UITableView) - Qiita

 

複数セクションにわける↓

tableViewの設定を行う

 

    // セクションの数を返す。

    func numberOfSections(in tableView: UITableView) -> Int {

        return self.sections.count  //sectionsはすべての要素が入った配列です

    }

    

    // セクションのタイトルを返す。

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

        var dateTitle = String()

        let i = section //sectionは、numberOfSectionsで指定した数です。たぶん笑

        dateTitle = String(sections[i][0][4]) //個人的内容ですが[i][0][4]に日付が入ってます。

        let title = taskDateSort(dateTitle : dateTitle, taskDate : "") //オリジナル関数に飛ばして、セクションのタイトルを返り値で取得して反映させてます。

        return title



        

    }

  

    // セルの数を返す。 ◯

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        // テーブルビューのセル数の設定する。

        

        

        let i = section

        return self.sections[i].count

        

    }

    

    // セルを返す。

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        // セルにテキストを出力する。

        

        let cell = tableView.dequeueReusableCell(withIdentifier:  "cell", for:indexPath as IndexPath) // ここは、"cell"のとこ以外固定なので特になし

        

        let i = indexPath.section //今実行中?の要素がindexPathに入ってるので、そのセクションの番号を取得

        cell.textLabel?.text = sections[i][indexPath.row][0]//配列の中のどの要素を表示させるかを指定

        return cell

        

    }

 

 

②セクションのタイトルを動的に表示させる

f:id:t2mdev:20180517000421j:plain

個人的に今はGoogleのinboxのTODOを仕事&プライベートで使用していて

リマインダーのアーカイブが、今日・昨日・今週など動的に表示がされるため

同じように対応させたかった。

そのため、完了したタスクの日時と今の日時の差を求める方法が必要なので検索!

Swift3での日時に関する処理

 

//上のオリジナル関数に飛ばした先がこのあたりで、今日の日付とタスクの完了した日付を比較してセクションのタイトルへ値を返す。
if calendar.isDate(taskDateTitle!, inSameDayAs: caleSet[0]) {
  return "今日" }else if calendar.isDate(taskDateTitle!, inSameDayAs: caleSet[1]) {   return "昨日" }else if taskDateTitle! >= caleSet[2]{ return "今週" }else if taskDateTitle! >= caleSet[3]{ return "先週" }else if taskDateTitle! >= caleSet[4]{ return "今月" }else if taskDateTitle! >= caleSet[5]{ //先月 return "先月" }else if taskDateTitle! >= caleSet[6]{ //2ヶ月前 let twoMonths = String(calendar.component(.month, from: caleSet[6])) + "月" return twoMonths }else if taskDateTitle! >= caleSet[7]{ //3ヶ月前 let threeMonths = String(calendar.component(.month, from: caleSet[7])) + "月" return threeMonths


それぞの比較するのに

comps = DateComponents(day: 1)

let thisMonth = calendar.nextDate(after: todayDate, matching: comps, matchingPolicy: .nextTime, direction: .backward)

こんな感じで表示したいセクションのタイトルに合わせて計算を組む

 

と、いった感じ。

 

とりあえず実装完了

したはいいものの、おかげで今週はだいぶ寝不足。

仕事はIT系ではないのだけど、片手間でGASでシステム組んだりなんだかんだしてるのでとにかく目がダルい。

↓本気でアイケアほしい。

 

 

パナソニック 目もとエステ 白 EH-SW65-W

せいぜい40℃くらいまでらしいので、50℃近くまで上がって5000円くらいにならないかなー笑