maharu
今回はRealmを使用したToDoList Appの作り方を簡単に説明していきます。
Storyboardのレイアウトの作成
各コントローラーのコード
ViewController
import UIKit import RealmSwift class ToDoListItem: Object { @objc dynamic var item: String = "" @objc dynamic var date: Date = Date() } class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { @IBOutlet weak var table: UITableView! private var data = [ToDoListItem]() private let realm = try! Realm() override func viewDidLoad() { super.viewDidLoad() data = realm.objects(ToDoListItem.self).map({ $0 }) table.register(UITableViewCell.self, forCellReuseIdentifier: "cell") } //Mark: Table func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return data.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) cell.textLabel?.text = data[indexPath.row].item return cell } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) let item = data[indexPath.row] guard let vc = storyboard?.instantiateViewController(identifier: "view") as? ViewViewController else { return } vc.item = item vc.deletionHandler = { [weak self] in self?.refresh() } vc.navigationItem.largeTitleDisplayMode = .never vc.title = item.item navigationController?.pushViewController(vc, animated: true) } @IBAction func didTapAddButton(_ sender: Any) { guard let vc = storyboard?.instantiateViewController(identifier: "enter") as? EntryViewController else { return } vc.completionHandler = { [weak self] in self?.refresh() } vc.title = "New Item" vc.navigationItem.largeTitleDisplayMode = .never navigationController?.pushViewController(vc, animated: true) } func refresh() { data = realm.objects(ToDoListItem.self).map({ $0 }) table.reloadData() } }
EntryViewController
import UIKit import RealmSwift class EntryViewController: UIViewController, UITextFieldDelegate { @IBOutlet weak var textField: UITextField! @IBOutlet weak var datePicker: UIDatePicker! private let realm = try! Realm() public var completionHandler: (() -> Void)? override func viewDidLoad() { super.viewDidLoad() textField.becomeFirstResponder() textField.delegate = self datePicker.setDate(Date(), animated: true) navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Save", style: .done, target: self, action: #selector(didTapSaveButton)) } func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return true } @objc func didTapSaveButton() { if let text = textField.text, !text.isEmpty { let date = datePicker.date realm.beginWrite() let newItem = ToDoListItem() newItem.date = date newItem.item = text realm.add(newItem) try! realm.commitWrite() completionHandler?() navigationController?.popViewController(animated: true) } else { print("Add something") } } }
ViewViewController
import UIKit import RealmSwift class ViewViewController: UIViewController { public var item: ToDoListItem? public var deletionHandler: (() -> Void)? @IBOutlet weak var itemLabel: UILabel! @IBOutlet weak var dateLabel: UILabel! private let realm = try! Realm() static let dateFormatter: DateFormatter = { let dateFormatter = DateFormatter() dateFormatter.dateStyle = .medium return dateFormatter }() override func viewDidLoad() { super.viewDidLoad() itemLabel.text = item?.item dateLabel.text = Self.dateFormatter.string(from: item!.date) navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .trash, target: self, action: #selector(didTapDelete)) } @objc private func didTapDelete() { guard let myItem = self.item else { return } realm.beginWrite() realm.delete(myItem) try! realm.commitWrite() deletionHandler?() navigationController?.popViewController(animated: true) } }