前提・実現したいこと
SwiftUI
とFirebase
(FirebaseFirestoreSwift
)を利用してアプリの開発をしています。
あるViewを表示する際に、Firestore
からデータを取得し、その中のあるデータを表示したいのですが、実際にFirestore
に保存されているものと、違うデータが表示されてしまいます。
解決の方法ご存知の方おりましたら、ご教授いただきたいです。
発生している問題
以下のようなビューの画面で、タイトルを入力し、[Add]をタップすると、入力した内容がFireStore
のCollection
に保存され、その後全てのDocument
を取得し、表示するという動きをしたいのですが正しく表示されません。
例えば、以下のようになります
- AAAと入力し[Add] → AAAと表示される
- BBBと入力し[Add] → BBBと表示される
- CCCと入力し[Add] → BBBと表示される
この際に、Firebaseのコンソール画面で、データを確認すると入力したとおりに保存されている事を確認できます(AAA,BBB,CCC)。
該当のソースコード
Swift
1 2import SwiftUI 3import Firebase 4import FirebaseFirestoreSwift 5 6struct GetDataTest: View { 7 8 @State var items:[Item] = [] 9 @State var title:String = "" 10 11 var body: some View { 12 VStack{ 13 List{ 14 ForEach(self.items.indices, id: .self){index in 15 16 ListRowTest( 17 title:self.items[index].title 18 ) 19 20// Text(self.items[index].title) 21// .font(.title) 22// .fontWeight(.bold) 23 } 24 } 25 26 Button(action: { 27 self.getAllItems() 28 }, label: { 29 Text("Update") 30 }) 31 32 TextField("Enter titel",text:self.$title) 33 .textFieldStyle(RoundedBorderTextFieldStyle()) 34 35 Button(action: { 36 37 let item = Item(title: self.title) 38 39 self.addItem(item: item){ (status) in 40 self.getAllItems() 41 } 42 43 self.title = "" 44 }, label: { 45 Text("Add") 46 }) 47 } 48 .onAppear{ 49 self.getAllItems() 50 51 } 52 } 53 54 func getAllItems(){ 55 56 self.items = [] 57 58 let ref = Firestore.firestore() 59 60 ref.collection("Items").getDocuments{ 61 (snap, err) in 62 guard let docs = snap else{return} 63 64 docs.documentChanges.forEach{ (doc) in 65 let item = try! doc.document.data(as:Item.self) 66 self.items.append(item!) 67 } 68 } 69 } 70 71 func addItem(item:Item , completion:@escaping (Bool) -> ()){ 72 73 let ref = Firestore.firestore() 74 75 do{ 76 let _ = try 77 ref.collection("Items").addDocument(from: item){ (error) in 78 if error != nil{ 79 completion(false) 80 return 81 } 82 completion(true) 83 } 84 }catch{ 85 print(error.localizedDescription) 86 completion(false) 87 } 88 } 89} 90 91 92struct ListRowTest: View { 93 94 @State var title:String 95 96 var body: some View { 97 HStack{ 98 Text(title) 99 .font(.title) 100 .fontWeight(.bold) 101 } 102 } 103} 104 105 106struct Item : Identifiable,Codable { 107 108 @DocumentID var id : String? 109 var title : String 110 111 enum CodingKeys : String,CodingKey { 112 case id 113 case title 114 } 115} 116 117
試したこと
ListRowTest( title:self.items[index].title )
のところを、以下のように変更すると、正しく表示されます。
*struct
をコンポーネントとして利用したいので、この方法では解決できません
Text(self.items[index].title) .font(.title) .fontWeight(.bold)
補足情報
Xcode: Version 12.3
iOS: 14.0
Life Cycle: SwiftUI App
回答1件
あなたの回答
tips
プレビュー