Realmからデータを読み込む
var itemList:Results<TodoItem>!
itemList = realm.objects(TodoItem.self).sorted(byKeyPath: "date")
1行目 リストの宣言が特殊ですが、「var itemList:[TodoItem]」と扱いは同じです。TodoItemのインスタンスを保持する配列を宣言しています。
2行目 「realm.objects(TodoItem.self)」ここまでで、データを読み込み「sorted(byKeyPath: “date”)」で日付順に並べ替えをしています。
変更があった場合に再読み込み
var token:NotificationToken!
token = realm.observe { notification, realm in
//変更があった場合にここが実行される
self.tableView.reloadData()
}
データの変更時にrealm.observeの「{ }」波かっこの中に書いたコードが実行されます。tokenはこの監視を終了する時、参照のために使うものですので、大きな意味はありません。
itemListのデータをTableViewに表示
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return itemList.count
}
このメソッドでは、returnでTableViewの行の数を指定します。itemListにあるデータの数を指定すれば良いので、itemList.countとします。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell")
let item = itemList[indexPath.row]
cell?.textLabel?.text = item.title
let formatter = DateFormatter()
formatter.dateFormat = "MM/dd HH:mm"
cell?.detailTextLabel?.text = formatter.string(from: item.date)
return cell!
}
このメソッドは、それぞれの行に何を表示するのかをreturnで指定するものです。つまり、TableViewが5行であれば、このメソッドは5回呼ばれます。indexPath.rowで何行目か取得できます。
3行目 変数itemにこの行で表示すべきデータを入れておきます。
5~7行目 Dateクラスのインスタンスから日時を文字で取得します。
完成したコード
import UIKit
import RealmSwift
class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
let realm = try! Realm()
var itemList:Results<TodoItem>!
var token:NotificationToken!
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
itemList = realm.objects(TodoItem.self).sorted(byKeyPath: "date")
token = realm.observe { notification, realm in
self.tableView.reloadData()
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return itemList.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell")
cell?.textLabel?.text = itemList[indexPath.row].title
let formatter = DateFormatter()
formatter.dateFormat = "MM/dd HH:mm"
cell?.detailTextLabel?.text = formatter.string(from: itemList[indexPath.row].date)
return cell!
}
}
コメント