2017-05-31 34 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) 
    } 
} 
相關問題