基本コピペの開発記録

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

【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円くらいにならないかなー笑

 

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

アーカイブしたタスクの保存が、現在一覧表示になっているためtableViewを複数セクション化することにした!

 

この土日と進めていたけど、進捗状況は50%あたり。

 

本番用プロジェクトは中途半端に弄れないので、新規プロジェクトでここの部分だけ作成しながら、ところどころplaygroundで挙動を確認しているところ。

 

いくつか紹介したいコピペ元はあるけど、

実装側が完了していないので、完了次第紹介していきます。

 

f:id:t2mdev:20180514090210j:image

虫がこないならこんなところで、開発やりたい!

今日も休憩!

f:id:t2mdev:20180510222220j:image

 

どうもやる気が起きない!

全体のイメージが固まってないからか、どこから手をつけて、どうしていくかを考えてるうちに、考えがまとまらずMacがスリープしちゃう。

 

明日もう一度、全体の構成考え直ししよう!

【TODOアプリ】AI実装完了

そんな大層なものではないけれど、AIの実装完了!

といっても、所謂弱いAIレベルのものなので

ソースをご紹介するほどのことでもないので概要だけ。

 

TODOのタスク毎に重さを設定しており、タスクを処理する事に、そのポイントがたまっていく。

 

そのポイントは、日ごとに集計していく。

 

そして、その日ごとのポイントを元に偏差値を算出し、今日の数値と比較することで今日の仕事はどうだったのかをフィードバックする仕組み。

 

まだ調整段階だけど、とりあえず実装できた!

GWの目標はクリアかな?

 

もっと人間のメンタルに合わせたアプリなり製品作っていきたい!

 

f:id:t2mdev:20180506235910p:image

はてなブログでコード表示

デフォルトで準備してくれてればありがたいのにな〜。

他サイトで変換したりしていたけど、この方法が一番簡単でおすすめ!

 

f:id:t2mdev:20180505231345p:plain

 

 

■方法まとめ

①まず、HTML編集にする

f:id:t2mdev:20180505231503p:plain

②jsタグを入れる。

どこでも構いませんが、HTMLの一番上に入れるのが定番。

色を変えたい場合は、skin=sunburstのところのsunburstを書き換える。

書き換えできるテーマは→ Prettify Themes Gallery

<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?skin=sunburst"></script>

 

③コードタグを入れる。

コードを入力したいところへ予め以下を入力する。

<pre class="prettyprint">
--コード入力箇所--
</pre>

終わり。

 

ほんと簡単で助かる!

【TODOアプリ】円グラフの表示

TODOでタスクが完了した場合にその数をグラフで表示したいと

思い色々とググっていると、IOSでグラフを表示する場合 IOS- CHART のライブラリを使用するといいとのこと。

 

デモ版

https://github.com/danielgindi/Charts

デモ版の起動方法

https://qiita.com/ioschartsman/items/2e510d311cc4fcd25608

f:id:t2mdev:20180505221326p:plain

 

で、実際に新規プロジェクトでテスト!したいけど、

何からやったらいいかわからない笑

幸い円チャート版のコードを記入している記事が

ありましたので、コピペ。

iOS Chartsの使い方 - iOS(Swift)でグラフを作る - Project Unknown

 

f:id:t2mdev:20180505222229p:plain

で、起動したやつがこれ↑ なんだが、右と左のラベルが要らない。

消し方を探すが一向にでてこないので日本語は諦めて英語のページを

探すと・・・

 

見つかった!

凡例Labelの消し方

swift2 - ios-charts PieChart's label (legends) missing - Stack Overflow

右側のLabelの消し方

swift - How to hide labels in ios-charts? - Stack Overflow

 

f:id:t2mdev:20180505222828p:plain

 

コードは以下↓

 

 

 

import UIKit
import Charts

class ViewController: UIViewController {
    
    // storyboardから接続
    @IBOutlet weak var chartView: PieChartView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        setupGraph()
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    
    func setupGraph() {
        chartView.usePercentValuesEnabled = true
        //右側Labelの削除
        chartView.chartDescription?.text = ""
        //凡例Labelの非表示
        chartView.legend.enabled = false
        
        
        
        /*
        //凡例Labelの位置
        let l = chartView.legend
        l.horizontalAlignment = .right
        l.verticalAlignment = .top
        l.orientation = .vertical
        l.xEntrySpace = 7
        l.yEntrySpace = 0
        l.yOffset = 0
        //        chartView.legend = l
        */
 
        let values: [Double] = [1, 1, 1, 1]
        let date : [Double] = [1,2,3,4,5]
        var entries: [ChartDataEntry] = Array()
        for (i, value) in values.enumerated(){
            entries.append(ChartDataEntry(x: date[i], y: value, icon: UIImage(named: "icon", in: Bundle(for: self.classForCoder), compatibleWith: nil)))
        }
        
        
        let dataSet = PieChartDataSet(values: entries, label: "RABEL")

        dataSet.colors = ChartColorTemplates.vordiplom()
        
        let chartData = PieChartData(dataSet: dataSet)
        
        chartView.data = chartData
        
 }
    
  //http://www.project-unknown.jp/entry/ios-charts
}

 

【TODOアプリ】画面遷移でハマる

f:id:t2mdev:20180430222536j:plain

5時間ハマりました。。。😨

アプリ初回起動時にオープニング画面へ飛ばそうと、

 segue設定しようとしたけど、呼ばれてはいるがなぜか飛ばない!

segueの上下にprintでlog取ると出力はできているのに、segueは飛ばない!!

 

検索したらどうやら、viewDidLordとviewWillAppearでは飛ばないらしい。

早く検索すれば良かった!

 

以下参照!

viewDidLord → viewDidAppearに書くらしい。

【Swift】Segueが機能しない場合 - とりあえず何でも書く

 

if文等の条件でsegue、画面遷移を行いたい場合はこちら

【Swift】Storyboardの画面遷移(push)をコードから呼ぶ - Qiita