ソースはこちら
https://github.com/sventouz/swift_todoCoredata
CoreDataとは
デフォルトで使える、アプリ上で使用することができるデータベースのようなものらしいです。(間違っていたらごめんなさい)
なので簡単なデータとかを保存しておけます。複雑で大量なものは向いていない?です。
今回の場合は、todoリストで追加したタスクをCoreDataに保存することでアプリを閉じてもtodoリストが消えずに済みます。
これがCoreDataも外部DBも使用しないとなるとアプリを閉じるとリストが消えてしまいます。
CoreDataについては以下の記事ですごくわかりやすく書いてあります。
todoリスト作って行く
プロジェクトの作成
とりあえず「create project」したら UseCoreDataにチェックを入れておいてください。そうでないとCoreDataは使用できません。
完成(storyboard)
table viewを全体に敷いてnavigation controllerを使用します。
テキストフィールドと重要度を示すチェックボックス。最後に追加ボタンを押すことで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)
}
}
参考
非常にわかりやすくなっておりますのでこの記事でわからないことがあれば上記から遷移してみてくださいませ。