【问题标题】:Swift 5- Firebase- Putting users into sections with data loaded from firebaseSwift 5- Firebase- 将用户放入从 firebase 加载数据的部分
【发布时间】:2020-09-24 15:09:55
【问题描述】:

我有一个 tableview,其中包含从 firebase 目录加载的目录中的用户列表。我的问题是如何将它们放入类似于 iPhone 中联系人应用程序的部分。我希望每个用户都在相应的部分下显示他们的名字。

这是我的代码:

我的主视图控制器:

import UIKit
import Foundation
import Firebase
import FirebaseDatabase

class ViewController: UIViewController {
    
    //MARK: - variables for the textfield search
    @IBOutlet var field: UITextField!
    var filteredTable = [String]()
    
    //MARK: - Variables for the tableview data from Firebase
    var table = [FacStaffInfo]()
    var ref: DatabaseReference!

    
    @IBOutlet weak var Tableview: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //MARK: - setting the delegate for the test field for filter
        
        field.delegate = self

        //MARK: - This is all the functionality for the loading from Firebase to the TableView

        ref = Database.database().reference().child("users")
        
        ref.observe(DataEventType.value, with: {(snapshot) in
            if snapshot.childrenCount > 0 {
                self.table.removeAll()
                
                for user in snapshot.children.allObjects as! [DataSnapshot] {
                    
                    let object = user.value as? [String: AnyObject]
                    let title = object?["title"]
                    let name = object?["name"]
                    let email = object?["email"]
                    let phone = object?["phone"]
                    let office = object?["office"]
                    let bio = object?["bio"]

                    let user = FacStaffInfo(title: title as! String, name: name as! String, email: email as! String, phone: phone as! Int, office: office as! String, bio: bio as! String)

                    self.table.append(user)
                    
                        self.Tableview.reloadData()
                    
                    
                    
                }
            }
        })
        
    }
}


//MARK: - add the tableview functions

extension ViewController: UITableViewDataSource, UITableViewDelegate {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        //MARK: - adding functionality for textfield search
        if !filteredTable.isEmpty {
            return table.count
            
        }
        
        //MARK: - just returning the array from the database, keep if remove textfield crap
        return table.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "userCell") as! TableViewCell
        
        let user: FacStaffInfo
        
        user = table[indexPath.row]
        cell.titleLabel?.text = user.title
        cell.nameLabel?.text = user.name
        cell.emailLabel?.text = user.email
        cell.phoneLabel?.text = String(user.phone)
        cell.officeLabel?.text = user.office
        cell.bioLabel?.text = user.bio
        
        //MARK: - testing using arrays to filter tableview data
        
//        if !filteredTable.isEmpty {
//            cell.textLabel?.text = filteredTable[indexPath.row]
//        }
//        else {
//            cell.textLabel?.text = table.
//        }
//
//
//
//
//
       return cell


    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            performSegue(withIdentifier: "showDetail", sender: self)
            }
    
    
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "showDetail" {

            if let indexPath = Tableview.indexPathForSelectedRow {
                let destinationController = segue.destination as! InfoViewController

                destinationController.FacStaffData = table[indexPath.row]
            }
        }
    }
}

这是我的数据模型

import Foundation
import Firebase
import FirebaseDatabase


class FacStaffInfo {
    
    var title: String
    var name: String
    var email: String
    var phone: Int
    var office: String
    var bio: String
    
    init(title: String, name: String, email: String, phone: Int, office: String, bio: String) {
        self.title = title;
        self.name = name;
        self.email = email;
        self.phone = phone;
        self.office = office;
        self.bio = bio
        
        
        
    }
}

这是我的表格视图单元格

import UIKit
import Firebase
import FirebaseDatabase

class TableViewCell: UITableViewCell {
  
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var emailLabel: UILabel!
    @IBOutlet weak var phoneLabel: UILabel!
    @IBOutlet weak var officeLabel: UILabel!
    @IBOutlet weak var bioLabel: UILabel!

    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }
}

【问题讨论】:

    标签: ios swift firebase tableview sections


    【解决方案1】:

    斯威夫特 5

    如下声明你的类:

    class ViewController: UIViewController
    {
        // MARK: Outlets
        
        @IBOutlet weak var Tableview: UITableView!
        @IBOutlet weak var field: UITextField!
        
        // MARK: Properties
        
        var sectionNames: [String] = []
        var users: [String: [FacStaffInfo]] = [:]
        
        var ref: DatabaseReference!
    
        // MARK: View Controller Life Cycle
        
        override func viewDidLoad()
        {
            super.viewDidLoad()
            getUsersFromFirebaseDB()
        }
        
        deinit
        {
            ref.removeAllObservers()
        }
        
        // MARK: Private Methods
        
        private func usersFetched(_ usersData: [FacStaffInfo])
        {
            for user in usersData
            {
                guard let userNameFirstChar = user.name.first?.uppercased() else { continue }
                if var usersForKey = users["\(userNameFirstChar)"]
                {
                    usersForKey.append(user)
                    users["\(userNameFirstChar)"] = usersForKey
                }
                else
                {
                    // no users are stored in dictionary for key userNameFirstChar
                    users["\(userNameFirstChar)"] = [user]
                }
            }
        
            // sort dictionary keys and set it in sectionNames
            sectionNames = users.map { $0.key }.sorted()
        }
        
        private func getUsersFromFirebaseDB()
        {
            ref = Database.database().reference().child("users")
            ref.observe(DataEventType.value, with: { [weak self] (snapshot) in
        
                guard snapshot.childrenCount > 0 else { return }
        
                var users: [FacStaffInfo] = []
                for user in snapshot.children.allObjects as! [DataSnapshot]
                {
                    let object = user.value as? [String: AnyObject]
        
                    let title = object?["title"]
                    let name = object?["name"]
                    let email = object?["email"]
                    let phone = object?["phone"]
                    let office = object?["office"]
                    let bio = object?["bio"]
        
                    let user = FacStaffInfo(title: title as! String, name: name as! String, email: email as! String, phone: phone     as! Int, office: office as! String, bio: bio as! String)
                    users.append(user)
                }
        
                self?.usersFetched(users)
                self?.Tableview.reloadData()
            })
        }
        
        // MARK: Navigation
        
        override func prepare(for segue: UIStoryboardSegue, sender: Any?)
        {
            if segue.identifier == "showDetail"
            {
                if let indexPath = Tableview.indexPathForSelectedRow
                {
                    let destinationController = segue.destination as! InfoViewController
                    let char = sectionNames[indexPath.section]
                    let user = users[char]![indexPath.row]
                    destinationController.FacStaffData = user
                }
            }
        }
    }
    

    另外,添加以下扩展名:

    extension ViewController: UITableViewDataSource, UITableViewDelegate
    {
        func numberOfSections(in tableView: UITableView) -> Int
        {
            sectionNames.count
        }
    
        func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?
        {
            sectionNames[section]
        }
    
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
        {
            let char = sectionNames[section]
            return users[char]!.count
        }
    
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
        {
            let cell = tableView.dequeueReusableCell(withIdentifier: "userCell") as! TableViewCell
            let char = sectionNames[indexPath.section]
            let user = users[char]![indexPath.row]
            cell.nameLabel?.text = user.name
            return cell
        }
    
        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
        {
            performSegue(withIdentifier: "showDetail", sender: self)
            tableView.deselectRow(at: indexPath, animated: true)
        }
    }
    

    输出

    【讨论】:

    • 首先,非常感谢!但我还有一个问题。我对此仍然很陌生,这是我的第一个深入应用程序,但是当您说要获取数据并将其发送到该函数时。你是什​​么意思?
    • 好的,我想还有几个问题。所以我把 usersNamesFetched 函数放在我的 table.append 下方但在我的 Tableview.reload 上方,这并没有给我一个错误,但那是正确的位置吗?另外,当我现在运行它时,我的 tableview 上什么也没有显示
    • 我已经更新了答案,再次查看,看看会发生什么!
    • 你的意思是替换我在 viewDidLoad 中已有的内容吗?因为当我第一次构建它时,我将它带到了一个详细视图控制器,其中包含有关该单元的信息。那么我应该把那个 getUsersFromFirebaseDB 代替吗?还是把它放在它后面?
    • 是的,将您在 viewDidLoad 中所做的替换为 getUsersFromFirebaseDB
    猜你喜欢
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多