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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 10:02:31