簡単なPDCAアプリの開発

#前書き
アプリ開発の勉強をしたいと思い、こんなものあったらいいなと思ったものが意外と作れそうだったので、今回PDCAアプリを作ってみました。ここが良くないとか、こうした方が良いなどの意見があったら是非教えていただきたいです!!

##PDCAとは
ビジネス書などでよく使われている考えで、Plan、Do、Check、Actionの頭文字です。
物事を進めたり、自分のスキルを磨いたりする上でPDCAを繰り返すことで、目標を達成したりスキルアップできるという考え方です。

##自分の開発レベル
アプリ開発の入門書を二冊買って、本に書いてるアプリを作ったくらいのレベルです。
購入した本
1,絶対に挫折しないIPhoneアプリ開発「超」入門 第七版 
2,たった二日でマスターできるIPhoneアプリ開発集中講座 Xcode 10

##開発環境
Xcode 10.2.1
Swift 5.0.1

##ざっくりしたアプリの概要
アプリ起動後、以下のような画面が出てきて、Planボタンをタップして、そこで自分の目標だったりを記入して、保存ボタンでそのテキストを保存。Checkボタンでは、Planで設定したことについて行動中に気づいたことやなどを記入して保存。Actionボタンでは、行動後、改善点を記入して保存。Stackボタンは、今までのPlanをリスト形式にして表示して、タップしたら、そのPlanについての詳細を表示
![スクリーンショット 2019-10-03 17.37.48 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263740/a92ae91b-1ed4-e387-c046-1f45731e3c3d.png)
![スクリーンショット 2019-10-03 17.38.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263740/308729a9-e61c-7539-9666-9c8c6dd74fa2.png)
![スクリーンショット 2019-10-03 17.38.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263740/38d92988-53d3-1126-dd6c-83ea7e455ce8.png)
![スクリーンショット 2019-10-03 17.38.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263740/aa769b6d-5f42-eee7-5531-3b600ebc08e6.png)
![スクリーンショット 2019-10-03 17.39.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263740/44c9e58a-da1b-8d1b-ff38-486160b58073.png)
![スクリーンショット 2019-10-03 17.39.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263740/0536c50c-996f-0f6b-a596-c7f865ba5a0f.png)

##必要な技術(?)
1,Segueによる画面遷移
色々なサイトなどで紹介されていますが、Storyboardで、ButtonをどこかのViewControllerに置いて、そこから`control`を押しながら、遷移したい画面まで引っ張る。

2,画面遷移時に次のViewControllerへ値渡し
　
まず1の手順通りSegueで、ViewController同士を繋げます。そして、SegueのIdentiferに名前をつけます(例,toNext)
このサイトを参考にしました(https://capibara1969.com/1060/)

```
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        // Segueの識別子が値渡ししたいSegueのものか確認
        if segue.identifier == "toNext" {
 
            // 遷移先ViewControllerの取得
            let nextView = segue.destination as! NextViewController
 
            // 遷移先のプロパティに値渡し
            nextView.title = textField1.text!
        }
    }

```


3,データ保存
IOSアプリのデータ保存の仕方はいくつかあるみたいですが、初めてということで簡単そうなUserDefaultsを使ってみました。UserDefaultsは基本的にはKey, valueの形式でXMLファイルで保存します。（こちらのサイトを参考にしました。https://i-app-tec.com/ios/nsuserdefaults.html）

自分は、Plan,Check,Actionで入力した内容を、Planが作られた順に番号で紐付けしようと考えました。
作られた順番

|  作られた順番 | Plan | よかった点 | 悪かった点 | 気づいた点 | 改善点 | 保存される形 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|  0 | TOEIC 750点  | 長文練習  | リスニング  | Part3がむずい  | 毎日リスニング  | TOEIC 750点/長文練習/リスニング/Part3がむずい/毎日リスニング|
|   1|  体重増量 | 毎日筋トレできた  | 食事代  | プロテイン安い  | プロテインを輸入  |   体重増量/毎日筋トレできた/食事代/プロテイン安い/プロテインを輸入|

つまり、`0`をkeyとしてデータを取得すると`TOEIC 750点/長文練習/リスニング/Part3がむずい/毎日リスニング`が返ってきます。よって、この情報をparse(解析)します。具体的には、/ごとに情報を配列に入れていきます。

```
 func parse() -> Void {

        // Keyを指定して元の文を取得
        let str:String = userDefaults.object(forKey: key) as! String
       
        //空の配列にparseしていく
        let array = str.components(separatedBy: "/")
        nice = array[0]     //よかった点
        bad = array[1]      //悪かった点
        noticed = array[2]  //気づいた点
        action = array[3]   //改善点
          
    }
```


4,ListViewにおける画面遷移&値渡し
このアプリでは、ListViewからの画面遷移を実装しています。Listviewからの値渡しは、ユーザーによってタップされたCellのindexpathを取得し、そこからrowを読み取ることで、選択されたCellが上から何番目のCellかを取得できるようにしています。

```

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        print("prepare")
        
        if let indexPath = self.tableView.indexPathForSelectedRow{

            var title: String = userDefaults.object(forKey:String(indexPath.row)) as! String

            let secondVC: StackController = (segue.destination as? StackController)!        //ViewControllerの決定
            print(title)
            
            secondVC.key = String(title)
        }

```



5,UIデザイン
自分はSketchを使いました。無料トライアル期間があるので試しに使ってみるといいかもしれません。パワポでもできると思いますがIphoneをもとにしたサイズ感でデザインするのが難しいかもしれないです。

##詰まったところ

1, ボタンやTextfieldなどをStoryboardで配置して、コードと紐付けた後にそのボタンを削除したりすると、コードが存在しないものと紐づいた状態になり、アプリがクラッシュしたりするので、紐付けは慎重に行う!

2, アプリ起動後、最初に表示されるViewControllerをStoryboardで削除してそのままアプリを起動すると、最初に起動する画面がないってことでクラッシュする。なので、別のViewControllerについてStoryboardの右のパネルの`is initial　View Controller`をチェックする。

##今後の改善点
1, emulatorを起動して、Planとかのtextfieldに何か入力するとき、PCのキーボードを使って入力すると、それ以降iphoneスタイルの入力ができなくなり、保存もうまくいかなくなる点。

2, データ保存の仕方が、入力内容について/で繋げてそれを保存し、取得するときは/をもとにparseするので、入力内容に/が入っていたらうまく取得できない点。