Firestore 响应 "cannot find 'cards' in scope"
Firestore responding with "cannot find 'cards' in scope"
我按照这个 tutorial 从 firestore 获取数据并更改了我需要的与我的模型相对应的内容,但它一直响应“在范围内找不到 'cards'”,我不确定我做错了什么。 (我想我的 mvvm 标签是对的)
VIEW
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)!
}
}
List
将为其尾随闭包提供一个元素——请参阅我的代码中的 card in
。然后,您可以在 Text
元素中访问特定的 card
。
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]()
—— 即 Card
的数组。从命名的角度来看,这会更有意义。
我按照这个 tutorial 从 firestore 获取数据并更改了我需要的与我的模型相对应的内容,但它一直响应“在范围内找不到 'cards'”,我不确定我做错了什么。 (我想我的 mvvm 标签是对的)
VIEW
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)!
}
}
List
将为其尾随闭包提供一个元素——请参阅我的代码中的 card in
。然后,您可以在 Text
元素中访问特定的 card
。
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]()
—— 即 Card
的数组。从命名的角度来看,这会更有意义。