2017-05-31 36 views
0

我看了看周围,我无法弄清楚这一点。如果Firebase快照为零,则为UITableView单元格的默认值

我想设置一个的tableView细胞的默认值如果火力地堡快照返回

例子:

快照由显示在所有的事件名字我Firebase数据库 在使用dequeReusableCell的tableView中。

但是,如果快照返回nil,则的tableView返回与1个单元与一个标签说:“对不起,没有活动。



这里是我的火力点快照码。如果快照确实返回nil,则此代码当前处理为print()语句。

func populateTableView(){ 
     let uid = Auth.auth().currentUser?.uid 
     ref = Database.database().reference() 
     ref.child("events").child(uid!).child(currentDate).observeSingleEvent(of: .value, with: { (snapshot) in 

      self.events = [] 
      if let snapshot = snapshot.children.allObjects as? [DataSnapshot] { 
       for snap in snapshot { 
        //print("SNAP: \(snap)") 
        if let postDict = snap.value as? Dictionary<String, AnyObject> { 
         let key = snap.key 
         let event = Event(postKey: key, postData: postDict) 
         self.events.append(event) 
         //print(self.events) 
        } 
       } 

      } 

      if !snapshot.exists() { 

       self.eventStatus = false 
       self.tableView.reloadData() 
       print("No Event here") 

      } else { 

       self.eventStatus = true 
       self.tableView.reloadData() 
      } 

     }) 

    } 

的火力对象获取存储到事件等级和存储的字典。我不认为这个代码是必需的,但这里是更多上下文的事件类代码。

import Foundation 
import Firebase 

class Event { 

    var ref: DatabaseReference! 

    private var _description: String! 
    private var _imageUrl: String! 
    private var _eventTitle: String! 
    private var _eventType: String! 
    private var _eventTime: String! 
    private var _eventStartDate: String! 
    private var _eventEndDate: String! 
    private var _monthlyRepeat: String! 
    private var _weeklyRepeat: String! 
    private var _eventColor: String! 

    private var _postKey: String! 
    private var _postRef: DatabaseReference! 

    var description: String { 
     return _description 
    } 

    var imageUrl: String { 
     return _imageUrl 
    } 

    var eventTitle: String { 
     return _eventTitle 
    } 

    var eventType: String { 
     return _eventType 
    } 

    var eventTime: String { 
     return _eventTime 
    } 

    var eventStartDate: String { 
     return _eventStartDate 
    } 

    var eventEndDate: String { 
     return _eventEndDate 
    } 

    var monthlyRepeat: String { 
     return _monthlyRepeat 
    } 

    var weeklyRepeat: String { 
     return _weeklyRepeat 
    } 

    var eventColor: String { 
     return _eventColor 
    } 

    var postKey: String { 
     return _postKey 
    } 



    init(postKey: String, postData: Dictionary<String, AnyObject>) { 
     self._postKey = postKey 

     if let description = postData["description"] as? String { 
      self._description = description 
     } 

     if let imageUrl = postData["event_Image_URL"] as? String { 
      self._imageUrl = imageUrl 
     } 

     if let eventTitle = postData["event_Title"] as? String { 
      self._eventTitle = eventTitle 
     } 

     if let eventType = postData["event_Type"] as? String { 
      self._eventType = eventType 
     } 

     if let eventTime = postData["event_Time"] as? String { 
      self._eventTime = eventTime 
     } 

     if let eventStartDate = postData["start_Date"] as? String { 
      self._eventStartDate = eventStartDate 
     } 

     if let eventEndDate = postData["end_Date"] as? String { 
      self._eventEndDate = eventEndDate 
     } 

     if let monthlyRepeat = postData["monthly_Repeat"] as? String { 
      self._monthlyRepeat = monthlyRepeat 
     } 

     if let weeklyRepeat = postData["weekly_Repeat"] as? String { 
      self._weeklyRepeat = weeklyRepeat 
     } 

     if let eventColor = postData["color"] as? String { 
      self._eventColor = eventColor 
     } 

     let uid = Auth.auth().currentUser?.uid 
     ref = Database.database().reference() 
     let eventRef = ref.child("events").child(uid!).child("Monday May, 29") 


     _postRef = eventRef.child(_postKey) 

    } 



} 
+0

我才明白你的题。你正在寻找如何填充你的tableview的帮助? – Barns

+0

是的。如果Firebase快照返回为零或不存在,我正在寻找一种显示某个单元格的方法。 – ethanfox27

+0

也许我刚刚输入的答案会让你开始。我没有测试过这些代码 - 如果你喜欢,请尝试。 – Barns

回答

0

解决这个最简单的方法是将标题UILabel添加到您的ViewcController和更改文本时快照不可用。

或者,如果不适合你出于某种原因,你可以试试这个:

我没有检查这一点,但我可能会得到您的轨道上。

首先,您需要更改populateTableView方法,以便即使在快照没有结果时也会创建events阵列。即使快照没有结果,events阵列数将会是1(并且一行将被添加到tableView)。

populateTableView(){ 
    let uid = Auth.auth().currentUser?.uid 
    ref = Database.database().reference() 
    ref.child("events").child(uid!).child(currentDate).observeSingleEvent(of: .value, with: { (snapshot) in 

     self.events = [] 
     if let snapshot = snapshot.children.allObjects as? [DataSnapshot] { 
      for snap in snapshot { 
       //print("SNAP: \(snap)") 
       if let postDict = snap.value as? Dictionary<String, AnyObject> { 
        let key = snap.key 
        let event = Event(postKey: key, postData: postDict) 
        self.events.append(event) 
        //print(self.events) 
       } 
      } 
     } 
     else{ // Snapshot does not exist 
      let postDict: Dictionary<String, AnyObject> // Add an empty Dictionary 
      let key = -1 // Or what ever value you could not possibly expect 
      let event = Event(postKey: key, postData: postDict) 
      self.events.append(event) 
      self.tableView.reloadData() 
      print("No Event here") 
     } 
    }) 
} 

注意,当快照无效,或者您可以添加一个空Dictionary具有独特key价值,你的events阵列。

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

您需要创建两个具有唯一标识符的自定义单元格。

现在你可以“实际上是”填充您的tableView与此类似:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let event = events.[indexPath.row] 
    let conditionKey = event.key 
    if(conditionKey == -1){ // or whatever value you gave in populateTableView to indicate that snapshot did not exist 
     let cell = tableView.dequeueReusableCell(withIdentifier: "identifierCellNotSoGood", for: indexPath) as! CustomCellNotSoGood 
     cell.noSnapShotLabel1.text = "Sorry, there are no events." 
     return cell 
    } 
    else{ 
     let cell = tableView.dequeueReusableCell(withIdentifier: "identifierCellAllGood", for: indexPath) as! CustomCellAllGood 
     cell.yourCustomLabel1.text = event.key  // Or whatever data you are displaying 
     cell.sourCustomLabel2.text = event.event // Or whatever data you are displaying 
     return cell 
    } 

    return UITableViewCell 
} 

如果您需要处理一个表格单元格的选择,你可以这样做:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    // get rid of the ugly highlighting 
    tableView.deselectRow(at: indexPath, animated: false) 

    let event = events.[indexPath.row 
    let conditionKey = event.key 
    if(conditionKey == -1){ // or whatever value you gave in populateTableView to indicate that snapshot did not exist 
     // Do what you need or not 
    } 
    else{ 
     // Do something meaningful with your database 
     doSomething(withEventData: event) 
    } 
} 
相关问题