Xcode(UIKit)中如何将Firebase实时数据库用户数据显示在TableView
解决方案:将Firebase用户数据显示在UITableView中
1. 创建用户数据模型
先定义结构体封装用户信息,让数据管理更清晰:
struct User { let id: String let username: String? let grade: String? }
2. 配置ViewController核心组件
在NewConversationsViewController中添加数据源数组,完成TableView的代理、数据源设置并将其加入视图层级:
// 新增:存储用户数据的数组 private var users = [User]() private let tableView: UITableView = { let table = UITableView() table.isHidden = false table.register(UITableViewCell.self, forCellReuseIdentifier: "cell") return table }() override func viewDidLoad() { super.viewDidLoad() // 新增:设置TableView代理与数据源 tableView.delegate = self tableView.dataSource = self // 新增:将TableView添加到视图 view.addSubview(tableView) tableView.frame = view.bounds // 原有Firebase数据获取逻辑(后续修改) // ... }
3. 修改Firebase数据获取逻辑
把获取到的用户数据存入数组,在主线程刷新TableView(UI操作必须在主线程执行):
let databaseRef = Database.database().reference() let usersRef = databaseRef.child("user") usersRef.observe(.value, with: { snapshot in // 每次获取数据前清空数组,避免重复数据 self.users.removeAll() for child in snapshot.children { guard let userSnapshot = child as? DataSnapshot else { continue } let userDict = userSnapshot.value as? [String: Any] let userKey = userSnapshot.key let username = userDict?["userName"] as? String let grade = userDict?["grade"] as? String // 创建User实例并加入数组 let user = User(id: userKey, username: username, grade: grade) self.users.append(user) } // 主线程刷新TableView DispatchQueue.main.async { self.tableView.reloadData() } }) { (error) in print("Error fetching user data: \(error)") }
4. 实现UITableView数据源方法
扩展ViewController,实现必要的数据源方法展示用户信息:
extension NewConversationsViewController: UITableViewDataSource, UITableViewDelegate { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // 返回用户数组长度 return users.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) let user = users[indexPath.row] // 拼接用户名和年级作为cell文本 var displayText = "" if let name = user.username { displayText = name } if let grade = user.grade { displayText += displayText.isEmpty ? "年级:\(grade)" : " | 年级:\(grade)" } cell.textLabel?.text = displayText.isEmpty ? "未知用户" : displayText return cell } }
完整代码
import UIKit import FirebaseAuth import FirebaseDatabase // 用户数据模型 struct User { let id: String let username: String? let grade: String? } class NewConversationsViewController: UIViewController { private var users = [User]() private let tableView: UITableView = { let table = UITableView() table.isHidden = false table.register(UITableViewCell.self, forCellReuseIdentifier: "cell") return table }() override func viewDidLoad() { super.viewDidLoad() tableView.delegate = self tableView.dataSource = self view.addSubview(tableView) tableView.frame = view.bounds let databaseRef = Database.database().reference() let usersRef = databaseRef.child("user") usersRef.observe(.value, with: { snapshot in self.users.removeAll() for child in snapshot.children { guard let userSnapshot = child as? DataSnapshot else { continue } let userDict = userSnapshot.value as? [String: Any] let userKey = userSnapshot.key let username = userDict?["userName"] as? String let grade = userDict?["grade"] as? String let user = User(id: userKey, username: username, grade: grade) self.users.append(user) } DispatchQueue.main.async { self.tableView.reloadData() } }) { (error) in print("Error fetching user data: \(error)") } view.backgroundColor = .white navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Cancel", style: .done, target: self, action: #selector(dismissSelf)) navigationItem.rightBarButtonItem?.tintColor = .systemBlue } @objc private func dismissSelf() { dismiss(animated: true, completion: nil) } } // UITableView代理与数据源实现 extension NewConversationsViewController: UITableViewDataSource, UITableViewDelegate { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return users.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) let user = users[indexPath.row] var displayText = "" if let name = user.username { displayText = name } if let grade = user.grade { displayText += displayText.isEmpty ? "年级:\(grade)" : " | 年级:\(grade)" } cell.textLabel?.text = displayText.isEmpty ? "未知用户" : displayText return cell } }
内容的提问来源于stack exchange,提问作者Abdullah Imran
相关产品推荐
相关产品推荐

