【问题标题】:TableView not showing data from firebase but under "po snapshot" debug console shows the fetch dataTableView 不显示来自 firebase 的数据,但在“po 快照”调试控制台下显示获取数据
【发布时间】:2017-10-21 05:00:44
【问题描述】:
[The Table View is not showing any values that were defined in firebase.][1]

[Firebase 已连接。当我在调试控制台中执行打印对象时,正在获取定义的数据]

https://i.stack.imgur.com/cZuKb.png

**请随意组织和整理,我对此真的很陌生。 谢谢 ** //导入

import UIKit
import Firebase
import FirebaseDatabase

class DatabaseViewController: UIViewController, UITableViewDelegate, 
UITableViewDataSource {
override func viewDidLoad() {
    // Do any additional setup after loading the view.
    //Firebase Refernece
    ref = FIRDatabase.database().reference()
    databaseHandle = ref?.child("CandleInventory").observe(.childAdded,  
with: { (snapshot) in
        //Execute Snapshot
        let candle = snapshot.value as! String?
        if let actualCandle = candle {
            self.candleData.append(actualCandle)

                    }
    })

    tableView.reloadData()
}

@IBOutlet weak var tableView: UITableView!

var ref: FIRDatabaseReference!
var databaseHandle:FIRDatabaseHandle?

var candleData = [String]()


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

public func tableView(_ tableView: UITableView, numberOfRowsInSection 
section: Int) -> Int {
    return candleData.count
}

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: 
IndexPath) -> UITableViewCell {
    let cell = UITableViewCell(style: UITableViewCellStyle.default, 
reuseIdentifier: "cell")
    cell.textLabel?.text = candleData[indexPath.row]

    return(cell)
}


//Datajust wont output


}

【问题讨论】:

  • 在主线程上重新加载。并且不要将所有代码放在 viewDidLoad 中。
  • 请举例说明我如何做到这一点?我尝试将重新加载放在主线程上,但它仍然无法加载
  • @Anfernee 当您在重新加载数据上方打印时,您可以看到打印的值吗?
  • 很可能reloadData 必须在observe 回调中。

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

我很确定你想从观察者重新加载数据,也就是说,数据已经被追加:

databaseHandle = ref?.child("CandleInventory").observe(
   .childAdded,  
   with: { [weak self] (snapshot) in
       guard let `self` = self else { return }

       let candle = snapshot.value as! String?
       guard let actualCandle = candle else { return }

       self.candleData.append(actualCandle)

       DispatchQueue.main.async {
          self.tableView.reloadData() 
       }
   }
)

【讨论】:

  • 输入此内容时,我在“databaseHandle = ref?.child...”行中收到“不明确使用“observer”的错误,“.child”下的行显示为红色
  • @Anfernee 我使用了 traling 闭包,但在这里可能行不通,所以我把它改回来了。
【解决方案2】:

需要记住的几点-:

1) 确保将Data SourceDelegate 提供给表格视图。

2) 从数据库或服务器执行一些获取请求,确保 在主线程上重新加载表。

3) 利用表格中的可重复使用的单元格,节省内存。

4) 切勿将代码放在 viewDidLoad() 中。创建单独的函数并在此函数中调用它们。

5) 确保您也提供了正确的表格cell identifier

6) 确保您在数组中获得 count 值。

7) 保持代码整洁,以便更好地理解。

正如您所说,您可以使用 print 语句查看值,还要确保将它们附加到数组中,然后在主线程上重新加载表。

代码-:

import UIKit
import Firebase
import FirebaseDatabase

class DatabaseViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

 // OUTLETS AND VARIABLES

    @IBOutlet weak var tableView : UITableView!
    var ref                      : FIRDatabaseReference!
    var databaseHandle           :FIRDatabaseHandle?

    var candleData               = [String]()


   //MARK-: viewDidLoad()

     override func viewDidLoad() {
     super.viewDidLoad()
  // CALL FUNCTION HERE
    fetchResultFromFirebase()
   }

  // didReceiveMemoryWarning()

    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
   }

   // FUNCTION TO CONNECT FIREBASE AND GET VALUES

    func fetchResultFromFirebase(){

   // FETCH DATA FROM FIREBASE

    ref = FIRDatabase.database().reference()
    databaseHandle = ref?.child("CandleInventory").observe(.childAdded, 
    with: { [weak self] (snapshot) in
        //Execute Snapshot
        let candle = snapshot.value as! String?
        if let actualCandle = candle {

       // MAKE SURE VALUE IS APPENDED

        self.candleData.append(actualCandle) }
    })

   // RELOAD UI STUFF ON MAIN THREAD

   DispatchQueue.main.async {
    self.tableView.reloadData()
  }

}

// TABLE VIEW numberOfRowsInSection

   public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return candleData.count
   }

// ALWAYS USE REUSABLE CELLS

  public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

   let cell = tableView.dequeueReusableCell(withIdentifier: "CellComment", for: indexPath )

    cell.textLabel?.text = candleData[indexPath.row]

    return cell
 }

}

【讨论】:

  • 为每个方法添加一个 MARK: 以保持空实现,例如didReceiveMemoryWarning 不能被视为干净的代码。您还需要致电super.viewDidLoad()
  • @Sulthan 谢谢,已更正。我也处于学习阶段,从错误中学习是件好事。
  • 所以这个说“使用未声明的类型”注释单元格“?
  • @Anfernee 那是因为您没有任何自定义单元类。或者,如果您有一个给出该名称,则删除该行(“注释单元格”)。还要确保在情节提要和代码中提供正确的标识符,否则应用程序将崩溃。编辑了要删除的代码,如果您不这样做没有自定义单元格类。
【解决方案3】:

相当简单的修复。如果您不介意,我为您添加了一些错误处理并对其进行了一些清理。我不知道您是否需要为您的程序使用.observe,但请确保最终删除此侦听器或使用observeSingleEvent(of: .childAdded) 仅获取一次。如果此代码在第一轮没有产生任何结果,那么您可能需要使用 singleEvent 获得 .value,然后使用 observer 事件获得 .childAdded。如果您需要更多帮助,请告诉我。

@objc func firebaseCall(completionHandler: @escaping (Bool) -> ()){
     ref = FIRDatabase.database().reference()
    databaseHandle = ref?.child("CandleInventory").observe(.childAdded,  
with: { (snapshot) in
        if snapshot.value is NSNull{
            //Handle errors
            completionHandler(false)
            return
        }
        else{
            //Execute Snapshot
            if let candle = snapshot.value as? String{
                self.candleData.append(actualCandle)
                completionHandler(true)
            }
            else{
                completionHandler(false)
            }
        }
    })
}


override func viewDidLoad(){
     super.viewDidLoad()
     firebaseCall() { result in
          if result{
              self.tableView.reloadData()
          }
          else{
              //No data found
          }
     }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-13
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多