SwiftUI视图条件渲染问题:无法读取UE布尔值
问题解决:Firestore数据读取与SwiftUI视图显示错误
核心问题分析
你遇到的问题根源有三个:属性名大小写不匹配、Firestore字段取值逻辑错误、Bool类型直接传入Text初始化的类型不兼容。
1. 属性名大小写不匹配
Username模型中定义的布尔属性是小写ue,但在AttendingUsersView和UserViewModel中均使用了大写UE。Swift是严格区分大小写的语言,这直接导致代码无法找到对应属性,进而出现读取失败和Text初始化报错。
2. Firestore字段取值逻辑错误
在UserViewModel的getData方法中,你用d["UE"] != nil给ue赋值,这仅能判断字段是否存在,无法获取Firestore中存储的实际布尔值,最终导致ue的值永远为true(只要字段存在),无法正确读取原始数据。
3. Bool类型直接传入Text初始化报错
Text没有直接接受Bool类型的初始化器,即便属性名正确,直接写Text(item.ue)也会触发类型不匹配错误,需要将Bool转为字符串后再传入。
修改后的代码
Username模型(统一属性名)
struct Username: Identifiable { var id: String var name: String var ue: Bool // 保持小写,后续代码统一使用该命名 }
UserViewModel(修正取值逻辑与属性名对应)
class UserViewModel: ObservableObject { @Published var list = [Username]() func addData(name: String, ue: Bool) { let db = Firestore.firestore() db.collection("usernames").document(UserDefaults.standard.object(forKey: "value") as! String).setData([ "name": name, "ue": ue // 与模型属性名统一为小写 ]) { err in if let err = err { print("写入文档错误: \(err)") } else { print("文档写入成功!") } } } func getData() { let db = Firestore.firestore() db.collection("usernames").getDocuments { snapshot, error in if error == nil, let snapshot = snapshot { DispatchQueue.main.async { self.list = snapshot.documents.map { d in // 正确读取Firestore中的布尔值,无数据时默认设为false let ueValue = d["ue"] as? Bool ?? false return Username(id: d.documentID, name: d["name"] as? String ?? "", ue: ueValue) } } } else { print("读取数据错误: \(error?.localizedDescription ?? "未知错误")") } } } }
AttendingUsersView(修正属性引用与视图逻辑)
struct AttendingUsersView: View { @ObservedObject var model = UserViewModel() var body: some View { VStack { List(model.list) { item in if item.ue { // 布尔值可直接判断,无需写==true Text(item.name) // 若需显示ue的值,需转为字符串 // Text("\(item.ue)") } else { Text("不满足条件") } } DismissButton } .onAppear { model.getData() // 视图出现时触发数据加载 } } }
内容的提问来源于stack exchange,提问作者Iggi Jimenez
相关产品推荐
相关产品推荐

