# #swift #firebase #google-cloud-firestore #mvvm #swiftui
Вопрос:
Я последовал этому руководству, чтобы получить данные из 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)!
}
}
Комментарии:
1. То, что вы делаете, излишне. Вы уже создали парня с именем «querySnapshot». Затем вы создаете еще один снимок. Для чего это?
Ответ №1:
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]()
-то есть массив из Card
s. С точки зрения именования это имело бы гораздо больше смысла.
Комментарии:
1. У меня было такое чувство, что это было что-то такое простое. у меня есть еще один вопрос, у меня есть отдельная структура, которая использует URL-адрес профиля для создания изображения профиля в главном представлении. Я не уверен, как добавить это в KFImage без использования для каждого или списка
2. Извините, но это не ясно из такого количества информации. Хотя это может быть хорошей темой для нового вопроса.