swift - 使用 Firebase 存储数据库填充 TableView

标签 swift image firebase-realtime-database tableview firebase-storage

我如何通过 firebase 使用来自数据库和存储的信息填充我的 tableview? 我会展示这样的东西 Cell 这是我的数据库 database

import UIKit
import AVFoundation
import FirebaseDatabase

class HomeTableViewCell: UITableViewCell {

    // MARK: - IBOutlets

    @IBOutlet weak var name: UILabel!
    @IBOutlet weak var imageViews: UIImageView!
    @IBOutlet weak var ratingLabel: UILabel!
    @IBOutlet weak var mapButton: UIButton!
    @IBOutlet weak var backgroundCardView: UIView!

    let orangeColor = UIColor(red: 255/255, green: 128/255, blue: 0/255, alpha: 1)
    var bars : Bar?

    override func awakeFromNib() {
        super.awakeFromNib()
        downloadImage()

        backgroundCardView.backgroundColor = .white
        backgroundCardView.layer.cornerRadius = 10
        backgroundCardView.layer.masksToBounds = true
    }

    private func downloadImage() {
        if let bar = bars {
            Utility().getImage(withName: bar.imageName, completion: { (image) in
                self.imageViews.image = image
            })
        }
    }
}

class HomeTableViewController: UITableViewController, CAAnimationDelegate, UIViewControllerTransitioningDelegate {

    // MARK: - IBOutlets

    @IBOutlet weak var cartButton: UIButton!
    @IBOutlet weak var helpButton: UIButton!

    // MARK: - Variables

    var bars : Bar?
    var barList : [String]?
    var dbRef = Database.database().reference()
    var dbRoot = "Bar"

    // MARK: - Load View

    override func viewDidLoad() {
        super.viewDidLoad()

        SearchBar()
        getBarList()

        tableView.delegate = self
        tableView.dataSource = self
        self.tableView.rowHeight = 200
        self.tableView.separatorStyle = UITableViewCellSeparatorStyle.none
        self.tableView.contentInset = UIEdgeInsetsMake(8, 0, 8, 0)
        self.tableView.translatesAutoresizingMaskIntoConstraints = false

        let imageView = UIImageView(image: UIImage(named: "logotext.png"))
        imageView.widthAnchor.constraint(equalToConstant: 90).isActive = true
        imageView.contentMode = .scaleAspectFit
        self.navigationItem.titleView = imageView
        cartButton.setImage(UIImage(named: "emptyCart.png"), for: .normal)
        helpButton.setImage(UIImage(named: "help.png"), for: .normal)
    }

    private func getBarList() {
        let query = (dbRef.queryOrdered(byChild: "name"))
        query.observe(.value) { (snapshot) in
            var bars : [Bar] = []
            if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {
                for snap in snapshot {
                    guard let valueDict = snap.value as? [String : Any] else {
                        return
                    }
                    let barcategories = Bar(withDictionary: valueDict)
                    bars.append(barcategories)
                }
            }
            DispatchQueue.main.async {
                self.bars = bars
                self.tableView.reloadData() // aggiorno la tabella
            }
        }
    }

    func SearchBar() {
        if #available(iOS 11.0, *) {
            navigationController?.navigationBar.prefersLargeTitles = false
            let searchController = UISearchController(searchResultsController: nil)
            navigationItem.searchController = searchController
            navigationItem.hidesSearchBarWhenScrolling = true
            searchController.searchBar.placeholder = "Find a bar"
            searchController.searchBar.tintColor = .gray
        }
    }

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        guard let list = barList else {
            return 0
        }
        return list.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! HomeTableViewCell
        let bar : Bar!
        let image = UIImage(named: barList![indexPath.row])

        cell.contentView.layer.cornerRadius = 10
        cell.contentView.layer.borderColor = UIColor.clear.cgColor
        cell.contentView.layer.masksToBounds = false
        cell.layer.shadowColor = UIColor.gray.cgColor
        cell.layer.shadowOffset = CGSize(width: 0, height: 3)
        cell.layer.shadowOpacity = 0.4
        cell.layer.masksToBounds = false

        cell.name.text = bar?.name
        cell.imageViews.image = image
        return cell
    }
}

最佳答案

似乎 barList 变量被调用但从未启动,因此 tableView 总是返回 0 个单元格

关于swift - 使用 Firebase 存储数据库填充 TableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50834630/

相关文章:

CSS 图像垂直对齐

ios - Firebase 不将 URL 返回给 Swift

Swift Firebase 访问子快照中的数据(通过 childAdded)

swift - DispatchQueue 同步块(synchronized block)与异步 block

ios - 如何使用 Swift 和 parse.com 在 tableview 中显示图像

ios - 与 pushview Controller 保持相同的导航栏颜色

javascript - 仅 float 图像 css

ios - 如何使用 Swift 使用 Firebase 正确观察两个连接的节点

ios - iPad 的 Xcode 7 Storyboard问题

ios - 如何跟踪多次触摸