我按照本教程從 firestore 獲取資料并更改了我需要的內容以與我的模型相對應,但它一直回應“在范圍內找不到‘卡片’”,我不確定我做錯了什么。(我想我得到了正確的 mvvm 標簽)
看法
import SwiftUI
struct TestingView: View {
@ObservedObject private var viewModel = CardViewModel()
var body: some View {
List(viewModel.cards) {
Text(cards.name)
}
.onAppear() {
self.viewModel.fetchData()
}
}
}
查看模型
import Foundation
import Firebase
class CardViewModel: ObservableObject {
@Published var cards = [Cards]()
private var db = Firestore.firestore()
func fetchData() {
db.collection("cards").addSnapshotListener { (querySnapshot, error) in
guard let documents = querySnapshot?.documents else {
print("No documents")
return
}
self.cards = documents.map { queryDocumentSnapshot -> Cards in
let data = queryDocumentSnapshot.data()
let name = data["name"] as? String ?? ""
let pronoun = data["pronoun"] as? String ?? ""
let bio = data["bio"] as? String ?? ""
let profileURLString = data["profileURLString"] as? String ?? ""
let gradiantColor1 = data["gradiantColor1"] as? UInt ?? 0
let gradiantColor2 = data["gradiantColor2"] as? UInt ?? 0
let gradiantColor3 = data["gradiantColor3"] as? UInt ?? 0
return Cards(name: name, pronoun: pronoun, bio: bio, profileURLString: profileURLString, gradiantColor1: gradiantColor1, gradiantColor2: gradiantColor2, gradiantColor3: gradiantColor3)
}
}
}
}
模型
import Foundation
struct Cards: Identifiable {
var id = UUID().uuidString
var name: String
var pronoun: String
var bio: String
var profileURLString: String
var gradiantColor1: UInt
var gradiantColor2: UInt
var gradiantColor3: UInt
var profileURL: URL {
return URL(string: profileURLString)!
}
}
uj5u.com熱心網友回復:
List將為其尾隨閉包提供一個元素——參見card in我的代碼。然后,您可以訪問特定card于您的Text元素。
var body: some View {
List(viewModel.cards) { card in //<-- Here
Text(card.name) //<-- Here
}
.onAppear() {
self.viewModel.fetchData()
}
}
}
我建議您可能想要重命名為struct Cards,struct Card因為它是一張卡。然后,您的陣列將是@Published var cards = [Card]()- 即Cards的陣列。從命名的角度來看,這會更有意義。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/333914.html
標籤:迅速 火力基地 谷歌云firestore 虚拟机 迅捷
