SwiftUI - 在视图中显示从 Firebase 获取的数据?

2023-12-08

Firebase 我试图在 SwiftUI 视图中显示从 Firestore 获取的数据,但遇到问题。我从 Firebase 提取数据没有问题。但我无法按照我想要的方式显示数据。我使用 MVVM 架构。

我的模型是这样的:

struct UserProfileModel: Identifiable {

    @DocumentID var id : String?
    var username : String
    var uidFromFirebase : String
    var firstName : String
    var lastName : String
    var email : String

}

视图模型:

class UserProfileViewModel: ObservableObject {

    @Published var user : [UserProfileModel] = []

    private var db = Firestore.firestore()

    func data(){
        db.collection("Users").whereField("uuidFromFirebase", isEqualTo: Auth.auth().currentUser!.uid).addSnapshotListener { (snapshot, error) in
        guard let documents = snapshot?.documents else {
                print("No Documents")
            
                return
            }
        
            self.user = documents.compactMap { queryDocumentSnapshot -> UserProfileModel? in
            
                 return try? queryDocumentSnapshot.data(as: UserProfileModel.self)
             }
        }
    }
}

View:

struct MainView: View {

    @ObservedObject private var viewModel = UserProfileViewModel()

    var body: some View { // -> Error: The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions
        VStack{
            Text(viewModel.user.username) // -> I want to do this but XCode is giving an error.

            // This works but I don't want to do it this way.
            List(viewModel.user) { user in
                        VStack{
                            Text(user.username)
                            Text(user.firstName)
                            Text(user.lastName)
                            Text(user.email)
                            Text(user.uidFromFirebase)
                        }
                    }
        }
    }
}

在我观看和阅读的标题为“SwiftUI 从 Firebase 获取数据”的视频和文章中,我总是对 List 和 ForEach 进行叙述。但我想在任何地方使用这些数据。我与你分享了我所有的代码。我想了解如何做到这一点。


在我看来你真的只是想拥有one您正在为其提取数据的用户,但您已经设置了UserProfileViewModel与一组用户([UserProfileModel])。有多种方法可以解决这个问题。这是一个(检查代码以获取有关正在发生的事情的内联注释):

class UserProfileViewModel: ObservableObject {

    @Published var user : UserProfileModel? = nil // now an optional

    private var db = Firestore.firestore()

    func data(){
        db.collection("Users").whereField("uuidFromFirebase", isEqualTo: Auth.auth().currentUser!.uid).addSnapshotListener { (snapshot, error) in
        guard let documents = snapshot?.documents else {
                print("No Documents")
            
                return
            }
        
            self.user = documents.compactMap { queryDocumentSnapshot -> UserProfileModel? in
            
                 return try? queryDocumentSnapshot.data(as: UserProfileModel.self)
             }.first // Take the first document (since there probably should be only one anyway)
        }
    }
}
struct MainView: View {

    @ObservedObject private var viewModel = UserProfileViewModel()

    var body: some View {
        VStack {
          if let user = viewModel.user { //only display data if the user isn't nil
             Text(user.username)
             Text(user.firstName)
             Text(user.lastName)
             Text(user.email)
             Text(user.uidFromFirebase)
          }
        }
    }
}

我想说处理这个问题的更传统的方法可能是存储您的用户配置文件文档Users/uid/-- 这样你就可以使用document(uid)找到它而不是whereField query.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SwiftUI - 在视图中显示从 Firebase 获取的数据? 的相关文章

  • 如何在 Xcode 4.5 中添加旧版本的 iOS SDK

    我在这里复制了 iOS 5 1 SDK 应用程序 Xcode app Contents Developer Platforms iPhoneOS platform Developer SDKs 但是 我仍然无法在 Xcode 中选择基础 S
  • 在 for-in 循环中使用尾随闭包

    我在用着map for in 循环中的数组函数如下 let numbers 2 4 6 8 10 for doubled in numbers map 0 2 compile error print doubled 这会产生编译错误 使用未
  • ViewController.swift(界面)文件的用途是什么 - 在 Counterparts 中

    我刚刚注意到一个名为ViewController swift Interface 当我创建第一个 ViewController 时 Xcode 自动创建了它 Swift 中的类是否具有 需要与 Objective C 中相同的接口 并且由
  • Android 堆栈跟踪显示生产 Firebase crashlytics 中的测试代码

    该应用程序的 Play 商店版本的 Firebase crashlytics 中报告了该异常 当用户进入启动活动时会发生这种情况 任何帮助 将不胜感激 谢谢 没有其他可用的堆栈跟踪有助于跟踪代码发生的位置 Fatal Exception j
  • 从 Xcode 中的 OSX 模拟器删除应用程序

    如何像在 iOS 模拟器上一样从 OSX 模拟器中删除应用程序 由于核心数据 xcdatamodeld 的更改 我想删除一个应用程序 但我找不到方法 提前致谢 对于 macOS Monterey 和 Big Sur 该位置链接到设备文件夹位
  • SQlite 查询 - 如何检索多列数据?

    我很难在网上找到一个关于使用 xcode 和 cocos2dx 从 SQlite DB 获取多个值的工作示例 这是我的sql查询 char sql query 100 sprintf sql query SELECT FROM SQList
  • Swift 和 Objective-C 框架公开其内部结构

    我正在尝试将 Swift 添加到具有公共 私有和项目文件的现有 Objective C 框架中 为了让 Swift 能够访问项目文件 我添加了一个定义新模块的模块映射 例如MyFramework Internal 通过包含所有项目标题 如下
  • 当我打开特定的 XIB 文件时,Xcode 崩溃

    I had a XIB文件一直运行良好 直到今天 当我尝试在 Xcode 中打开它时 沙滩球出现 1 分钟后 Xcode 崩溃 其他的XIBs工作得很好 另外 如果我只是在我的设备上构建并运行项目 它也可以工作 并且 XIB 在应用程序中工
  • 尝试在 Xcode 中为 OS X 应用程序设置 Tab 键顺序

    我正在使用 Xcode 7 3 构建 OS X 桌面应用程序 并尝试为其中一个表单设置 Tab 键顺序 我发现有几篇文章解释了 Xcode 4 的类似问题 但没有任何进展 https www youtube com watch v SRrE
  • 如何在原生 Swift 中实现以前称为 NSMutableOrderedSet 的可变有序集泛型类型?

    我正在尝试实现一个通用的可变有序集类型 它需要符合许多协议才能以与 Swift 中的数组和集合相同的方式运行 首先要实现泛型类型元素需要符合Hashable https developer apple com documentation s
  • 为 iPhone 创建 .ipa

    我为 iPhone 开发了一款应用程序 构建后 我在构建文件夹中得到了 app 文件 我的应用程序名称是Myapp 然后我在build文件夹中得到了Myapp app文件 我的问题是我想创建 ipa 文件 这是怎么回事 它是为了安装 越狱的
  • 快速将数据从 tableviewcontroller 传递到另一个 tableviewcontroller

    我有一个正在创建的表单 该表单填充有用户输入的文本字段 回答完所有问题后 会弹出一个保存按钮 我在使此表视图控制器将数据传递到新的表视图控制器时遇到问题 我被困住了 不知道该怎么做 import UIKit class TableViewC
  • Firebase Analytics 服务器端[重复]

    这个问题在这里已经有答案了 Firebase 客户端 JS 支持 Firebase Analytics 在那里 我使用该方法logEvent将我的事件记录到 GA v2 并查看很棒的漏斗图 但是 显然 客户端不会跟踪某些事件 例如数据库事件
  • 为什么快速枚举中的可选项会导致无限循环?

    评估以下代码 我希望打印一次Hello World 相反 它会导致无限循环 有人可以解释为什么吗 let array what for text String in array print Hello World 删除可选的 显然让它只打印
  • Swift NotificationCenter 删除观察者最快的方法

    我正在添加一些观察员viewController applicationWillResignActive applicationDidEnterBackground 以及许多其他人 我想删除self作为一行中所有已注册通知的观察者 我的问题
  • XC测试元组

    我正在尝试构建一个单元测试 如下所示 region is a Double Double tuple XCTAssertEqual region 0 0 200 0 但 Xcode 给我一个错误 Cannot invoke XCTAsser
  • 如何让窗口最大化时所有控件按比例调整大小?

    当我单击最大化按钮时 窗口最大化 但控件未按比例调整大小 使控件相应调整大小的最佳方法是什么 我正在使用MVVM 这是我的代码
  • Xcode 本地化设置中没有加号或减号按钮

    我需要在两天内翻译 iOS 应用程序 但我的 XCode 版本 4 4 和 4 5 Developer Preview 都没有给我添加其他语言的选项 我只能选择单击 Make localized 但我只能选择英语 选择它后 Xcode 中的
  • Firebase A/B 测试支持的渠道

    我正在尝试了解 Firebase A B 测试 我基本上不明白一件事 Firebase A B 测试是否也支持 Web 移动和单页 React 之类的应用程序 我看到 Firebase 文档 但它没有说明这一点 然后 阅读有关通过更改远程配
  • 使用 NSOutlineView 作为文件系统目录浏览器的 Swift 代码

    我已经在这段 Swift 代码上苦苦挣扎了一段时间 但没有发现问题 代码 下面应该提供文件目录作为 NSOutlineView 的数据源 GUI 非常简单 只是一个带有 NSOutlineView 和 OutlineViewControll

随机推荐

  • Java Firestore Android 在查询中使用数组列表来显示关注用户的帖子

    我正在开发一项活动 显示用户关注的用户的帖子 对于帖子 我使用了以下结构 root posts collection uid documents userPosts collection postId documents title Pos
  • Python OSError:SFTP 失败

    我正在 Windows 11 笔记本电脑上测试 SFTP 通信 SFTP 服务器在 localhost 3373 上运行 一个sftp get请求生成一个 操作系统错误 失败 此代码错误 import pysftp remotepath C
  • 即使我声明了 Main 方法也未找到

    我想创建一个带有 main 方法的简单 java 类 但是当我编译代码时 我收到以下错误消息 错误 在类错误中找不到主方法 TestErrors 请定义 主要方法为 public static void main String args 这
  • 多个数据库连接和 Yii 2.0

    我有两个数据库 每个数据库都有相同的表和相同的字段 但是如何同时从所有两个数据库中获取所有记录Yii 2 0 首先 您需要配置数据库 如下所示 return components gt db1 gt class gt yii db Conn
  • jqGrid 列选择器对话框可调整大小,但调整大小时内部内容不会在调整大小时拉伸

    我使用 jqGrid 和 ui multiselect js 进行列选择和重新排序 出现的对话框可以调整大小 但调整大小时 对话框的内容不会调整大小 你必须参加任何活动才能做这些事情吗 你是对的 目前 这是列选择器中的问题 最好在代码中进行
  • Android Volley:POST 请求 - NodeJS REST API 内的 req.body 为空

    我知道它已经被讨论了十亿次 而且我已经阅读了几个问题 答案 特别是这个似乎是一个很好的例子 gt example 所以现在我尝试重新创建代码并添加我的getParams 以及我的getHeaders 尴尬的是我得到了 HTTP 状态代码 4
  • 如何在php中获取选择框的多个选定值?

    我有一个 html 表单 其中有一个选择列表框 您可以从中选择多个值 因为它的 multiple 属性设置为 multiple 考虑表单方法是 GET 表单的html代码如下
  • 从父级中删除多个子级?

    我有一堆同名的元素 我试图用 onchange 函数同时删除它们 这是 JavaScript 甚至不确定removeChildren是否是一个真正的命令 我的元素是给onchange操作
  • 加载多个图像时回调的跨浏览器解决方案?

    我检查了其他问题 但它们都包含如何在加载一张特定图像时进行回调的信息 var img new Image img src images img png if img complete img onload function code to
  • 在android 3.0(蜂窝)中隐藏系统栏

    如何在android 3 0 honeycomb 中隐藏系统栏 无法删除系统栏 在未 root 的设备上 您可以进入 熄灯模式 该模式会将其变暗并仅显示按钮使用以下代码的点 ref View v findViewById R id view
  • 如何在 SQL 语句中组合 AND 和 OR

    我有这样的SQL语句 SELECT FROM table WHERE type 3 OR type 5 OR type 4 and table deleted 1 我读过可以使用括号来完成此操作 但我想知道这是否有效 SELECT FROM
  • 从不区分大小写的数组中删除重复值的最佳解决方案[重复]

    这个问题在这里已经有答案了 我找到了一些解决方案 但我无法决定使用哪一个 使用 php 的最紧凑 最有效的解决方案是什么array unique 函数在不区分大小写的数组上 Example input array green Green b
  • 如何在 Meteor 中存储日期和时间以进行范围查询?

    我的应用程序需要创建在浏览器中的 3 个不同时区中显示 startDate 的对象 日期还必须包括确切的时间 日期的存储方式应允许查询 提供 X 和 Y 之间的所有日期 并将其解析为 3 个时区 我的问题是我应该如何最好地保存 并随后检索
  • 修复 GCC 的 #includes <> (Code::Blocks)

    我正在使用一些为不同编译器 链接器编写的代码 它包括如下文件 include
  • 将图像从加载项导入图像管理器

    我们通过插件在 EA 中自动创建需求元素 但问题是我们无法将图像从目录导入到图像管理器并将超链接添加到需求元素注释 那么 企业架构师是否提供了任何API来将图像从目录导入到图像管理器并将超链接添加到需求元素注释中 EA 将图像存储在t im
  • Android 按钮有两个功能

    我需要一个具有两个功能的按钮 如果我点击它一次 它就会转到下一页 如果我按住该按钮 它将允许我编辑按钮上的文本 点击该按钮后可以转到下一页 但是如何实现第二个功能 该功能允许我在按住按钮时更改文本 有人知道吗 java代码 public c
  • Google Datastore 跨区域复制

    我们有一个在美国和欧盟托管的应用程序 为了获得出色的性能 我们将在两个位置托管一个数据存储实例 现在我们的问题是如何将数据从美国数据存储复制到欧盟数据存储 或者从技术角度来看 我们将数据存储在哪里并不重要 目前还没有多位置 GAE 应用程序
  • 如何在子视图中使用addChildViewController

    我想用addChildViewController in View 子视图数组的一个视图 但我不知道这一点 这是我的代码 for UIView subview in self view subviews if subview tag 1 C
  • 是什么原因导致此错误“无法写入应用程序 file.ini”

    我的应用程序是用delphi构建的 它可以在除Windows 7 64位机器之外的其他平台上完美运行 每次尝试关闭应用程序都会给我这个错误 无法写入应用程序文件 ini 这是我的关闭代码 procedure TfrmMain FormClo
  • SwiftUI - 在视图中显示从 Firebase 获取的数据?

    Firebase 我试图在 SwiftUI 视图中显示从 Firestore 获取的数据 但遇到问题 我从 Firebase 提取数据没有问题 但我无法按照我想要的方式显示数据 我使用 MVVM 架构 我的模型是这样的 struct Use