寒川アクアブログ

美容師しながらアプリ開発していて水草が趣味の私のブログです

【Swift4】ToDoリストアプリを作る(3)

肝心要のCoreDataの設定

プロジェクトファイル内に自動的に作られた、アプリ名.Xdatamodeldから
Add Entityをクリックします。
追加されたEntityの名前を、今回は「Task」とします。
Attributesの「+」をクリックして、変数名とデータ型を以下のようにします。

f:id:kentaro198477:20190209004120p:plain
text・・・タスクのテキスト
position・・・タスクのポジション(上から何番目かを表す)
isChecked・・・チェックマークにチェック済みかどうか
dateUIC・・・タスクを識別するためのIDの代わり。現在時刻を記憶する。

空のタスクを、テーブルビューの最下位置に追加する

TableViewControllerに戻り、インポートと、変数の定義と、データベースからTaskの配列を取ってくるメソッドと、まっさらなタスクを追加するメソッドを記述します。
長いです。

import UIKit
import CoreData    //    ←追加

//    略

//    タスクを保存する変数
var tasks:[Task] = []
var context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

override func viewDidLoad() {
        super.viewDidLoad()
        
        getData()
        tableView.reloadData()
    }

//    CoreDataからTaskを取得し、tasksに格納・position順に並び替えを行う
    func getData() {
        do {
            // CoreDataからデータをfetchしてtasksに格納
            let fetchRequest: NSFetchRequest<Task> = Task.fetchRequest()
            tasks = try context.fetch(fetchRequest)
            tasks.sort(by: {$0.position < $1.position})
            saveData()
        } catch {
            print("Fetching Failed.")
        }
    }
    
    //    Taskを追加したり変更した時に呼ぶ
    func saveData(){
        (UIApplication.shared.delegate as! AppDelegate).saveContext()
    }



//    TableViewの、Rowの数を返すメソッドではtasksの要素数を返す
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return tasks.count
    }

 //    空のタスクを新規追加するメソッド
 func addNewStickyNote(){
        
        let task = Task(context: context)
        task.dateUTC = Date().timeIntervalSince1970
        task.position = Int64(tasks.count)
        task.text = ""
        task.isChecked = false
        saveData()
        
        //    tasksに追加し、TableViewに反映させる。追加した付箋までスクロールする
        tasks.append(task)
        tableView.insertRows(at: [IndexPath(row: tasks.count - 1, section: 0)], with: .top)
        tableView.scrollToRow(at: IndexPath(row: tasks.count - 1, section: 0), at: .bottom, animated: true)
    }
    

これで、addNewStickyNote()を呼び出せば、空のタスクが追加されるはずです。
前回作成したフローティングアクションボタンから呼び出してみましょう。
ViewControllerから呼び出すときは、
var tableViewController:TableViewController!
以前に作った変数から呼び出すことができます。