TableViewにRealmに保存したデータを表示しよう

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クラスのインスタンスから日時を文字で取得します。

DateFormatterとは
Dateクラスのインスタンスを文字に変換するためのツール
MMは月、ddは日を表す
この他にもyで年を表したりカスタマイズ可能<おすすめ記事>
【Swift】DateFormatterの使い方 | カピ通信

完成したコード

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!
    }
}

コメント

タイトルとURLをコピーしました