Realmに保存したデータをListで表示、
Cellごとに閲覧、編集、削除できるようにしたい。
と思っていましたが、削除する度に
Index 1 is out of bounds (must be less than 1)が出てクラッシュ。
長い間いろいろ英語の文章を参照したのですが、解決できなかった。
久しぶりに調べてみたら、この記事が救ってくれました。
https://llcc.hatenablog.com/entry/2020/04/26/205254
私のような新人の理解では、本来Listを出すには直接Realmへデータを取りに行くんですが、
今度は、ListのCellに対するView Modelを作り、View全体もView Modelを作り、
Listを出すにはViewModel経由で取得、
ForEach(model.myModels, id: .id)
↓
ForEach(model.cellModels, id: .id)
もう削除したデータ、存在しないデータへ取りに行くことは発生しない
中身はこんな感じ:
private var token: NotificationToken?
private var myModelResults = try? Realm().objects(MyModel.self)
@Published var myModels: [MyModel] = []
init() {
token = myModelResults?.observe { [weak self] _ in
self?.myModels = self?.myModelResults?.map { $0 } ?? []
}
}
deinit {
token?.invalidate()
}
ForEach(model.myModels, id: \.id)
を以下へ変更
private var token: NotificationToken?
private var myModelResults = try? Realm().objects(MyModel.self)
@Published var cellModels: [ContentViewCellModel] = []
init() {
token = myModelResults?.observe { [weak self] _ in
self?.cellModels = self?.myModelResults?.map { ContentViewCellModel(id: $0.id, title: $0.title) } ?? []
}
}
deinit {
token?.invalidate()
}
ForEach(model.cellModels, id: \.id)
このようにしたら、エラーが綺麗に解消できました。