【问题标题】:Firestore responding with "cannot find 'cards' in scope"Firestore 响应“在范围内找不到‘卡片’”
【发布时间】:2023-03-07 10:27:01
【问题描述】:

我按照这个tutorial 从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)!
    }
 }

【问题讨论】:

  • 你在做的是多余的。您已经创建了一个名为“querySnapshot”的人。然后创建另一个快照。那是为了什么?

标签: swift firebase google-cloud-firestore mvvm swiftui


【解决方案1】:

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]()——即Cards 的数组。从命名的角度来看,这会更有意义。

【讨论】:

  • 感觉就是这么简单。我还有另一个问题,我有一个单独的结构,它使用个人资料 url 生成主视图的个人资料图片。我不确定如何在不使用 for each 或 list 的情况下将其添加到 KFImage
  • 抱歉,仅凭这么多信息还不清楚。不过,这可能是一个新问题的好话题。
猜你喜欢
  • 2020-11-23
  • 2021-06-18
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多