LoginSignup
2
2

More than 3 years have passed since last update.

【swift5】CoreDataを使ってtodoリストを作成する

Last updated at Posted at 2020-01-02

ソースはこちら
https://github.com/sventouz/swift_todoCoredata

CoreDataとは

デフォルトで使える、アプリ上で使用することができるデータベースのようなものらしいです。(間違っていたらごめんなさい)

なので簡単なデータとかを保存しておけます。複雑で大量なものは向いていない?です。

今回の場合は、todoリストで追加したタスクをCoreDataに保存することでアプリを閉じてもtodoリストが消えずに済みます。

これがCoreDataも外部DBも使用しないとなるとアプリを閉じるとリストが消えてしまいます。

CoreDataについては以下の記事ですごくわかりやすく書いてあります。

todoリスト作って行く

プロジェクトの作成

とりあえず「create project」したら UseCoreDataにチェックを入れておいてください。そうでないとCoreDataは使用できません。

スクリーンショット 2019-12-31 9.36.45.png

完成(storyboard)

スクリーンショット 2020-01-02 9.50.44.png

table viewを全体に敷いてnavigation controllerを使用します。

スクリーンショット 2020-01-02 9.51.36.png

テキストフィールドと重要度を示すチェックボックス。最後に追加ボタンを押すことでtodoを追加できます。

コードは以下の通りです。

ViewController.swift

import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {


    @IBOutlet weak var tableView: UITableView!

    var tasks:[Task] = []
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.dataSource = self
        tableView.delegate = self
    }

    override func viewWillAppear(_ animated: Bool) {
        getData()
        tableView.reloadData()
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return tasks.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()
        let task = tasks[indexPath.row]
        if task.isImportant {
            cell.textLabel?.text = "👺" + task.name!
        } else {
            cell.textLabel?.text = task.name!
        }
        cell.textLabel?.text = task.name!
        return cell
    }

    func getData() {
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        do {
            tasks = try context.fetch(Task.fetchRequest())
        }
        catch {
            print("読み込み失敗")
        }
    }

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        if editingStyle == .delete {
            let task = tasks[indexPath.row]
            context.delete(task)
            (UIApplication.shared.delegate as! AppDelegate).saveContext()
            do {
                tasks = try context.fetch(Task.fetchRequest())
            }
            catch {
                print("読み込み失敗")
            }
        }
        tableView.reloadData()
    }

}

addTodoViewController.swift

import UIKit

class addTaskViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var isImportant: UISwitch!

    override func viewDidLoad() {
        super.viewDidLoad()
    }


    @IBAction func btnTapped(_ sender: Any) {
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

        let task = Task(context: context)
        task.name = textField.text!
        task.isImportant = isImportant.isOn

        (UIApplication.shared.delegate as! AppDelegate).saveContext()
        navigationController!.popViewController(animated: true)
    }
}

参考

非常にわかりやすくなっておりますのでこの記事でわからないことがあれば上記から遷移してみてくださいませ。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2