You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 03:55:26