前提
・フィルタをかけたRealmのDBをForEachで表示させている。
RealmSwiftを活用している。
・フィルターの内容は可変です。
実現したいこと
フィルターをかけたまま、DBの更新をしたい。
発生している問題・エラーメッセージ
フィルタをかけたRealmのDBをForEachで表示させているのですが、
DBの更新をすると、フィルターが解除されてしまいます。
該当のソースコード
swift
1 struct PersonView: View { 2 3 @ObservedResults(Person.self) var personGroups 4 @EnvironmentObject var viewModel: ViewModel 5 6 @State var arr:[String] = [] 7 8 let columns = [GridItem(.flexible(minimum: 10,maximum: .infinity), spacing: 0), 9 GridItem(.flexible(minimum: 10,maximum: .infinity), spacing: 0), 10 GridItem(.flexible(minimum: 10,maximum: .infinity), spacing: 0), 11 GridItem(.flexible(minimum: 10,maximum: .infinity), spacing: 0), 12 GridItem(.flexible(minimum: 10,maximum: .infinity), spacing: 0)] 13 var body: some View { 14 NavigationView { 15 ScrollView() { 16 LazyVGrid(columns: columns, spacing: 5) { 17 ForEach(personGroups) { person in 18 ZStack{ 19 Image(URL(string: person.imgURL)) 20 .onTapGesture { 21 //タップするとフィルターが剥がれてしまう 22 if(person.tmpCount < 4){ 23 viewModel.updatePersonCount(person.id, newDetail: person.tmpCount + 1) 24 //updatePersonCountの実実行です。 25 //try! model.realm.write { 26 // item[keyPath: keyPath] = newValue 27 //} 28 //参考:https://software.small-desk.com/development/2022/02/25/swiftui-realm-todoapp-step4/ 29 }else{ 30 viewModel.updatePersonCount(person.id, newDetail: 0) 31 } 32 } 33 if(person.tmpCount > 0){ 34 Text(String(person.tmpCount)) 35 } 36 } 37 } 38 } 39 } 40 .onAppear { 41 //本題ではないため、内容に意味はないです。 42 let randomInt = Int.random(in: 1..<5) 43 if(randomInt == 1){ 44 arr.append("a") 45 }else if(randomInt == 2){ 46 arr.append("a") 47 arr.append("b") 48 }else{ 49 arr.append("a") 50 arr.append("b") 51 arr.append("c") 52 } 53 $itemGroups.filter = NSPredicate(format: "Alphabet IN %@",arr) 54 } 55 } 56 } 57 } 58 59
試したこと
・onAppearでフィルターをかけているが、initで実施しようとしてエラーが出たので断念
・onTapGestureの中でフィルターを再度かけるようにしたが、かからなかった。
補足情報(FW/ツールのバージョンなど)
Realm:Bundle version string (short) 10.33.0
Realm Swift:Bundle version string (short) 10.33.0
Xcode 14.1(14B47b)
CPU:Apple M1
OS:Venture 13.0.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。