swift - 如果 Firebase 快照为零,则 UITableView Cell 的默认值

标签 swift uitableview firebase firebase-realtime-database

我环顾四周,但无法弄清楚这一点。

如果 Firebase 快照返回nil,我会尝试设置 tableView Cell 的默认值

示例:

制作快照以显示我的 Firebase 数据库中的所有事件名称 在 tableView 中使用 dequeReusableCell。

但是,如果快照返回 nil,则 tableView 返回 1 个单元格,并带有一个标签,显示“抱歉,没有事件。

<小时/> <小时/>

这是我的 Firebase 快照代码。当前,此代码确实会处理快照是否通过 print() 语句返回 nil。

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()
            }

        })

    }
<小时/>

firebase 对象存储在 Event 类中并存储在字典中。我认为不需要这段代码,但这里是更多上下文的事件类代码。

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)

    }



}

最佳答案

解决这个问题最简单的方法是添加标题 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对您的值(value)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)
    }
}

关于swift - 如果 Firebase 快照为零,则 UITableView Cell 的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44290987/

相关文章:

iphone - [indexPath 行] 中的 EXC_BAD_ACCESS

java - 将多个图像或文件上传到 firebase 中的存储并获取其 uri 并将 uri 放入数据库中

javascript - Firebase 实时数据库规则 - 允许多个用户访问列出所有消息

Swift - 如何减少矩阵

swift - 无法使用列表类型 NSURL 调用加载数据...正在加载本地 Web View 内容

ios - GestureRecognizer 不适用于 TableView

swift - 如何将附近的位置设置到从 Firebase 检索的 TableView 中

ios - 线程 1 : SIGNAL SIGABRT; What do I do?

ios - 如何在pjsip中修改current_acc?

ios - 根据内容的大小调整文本标签的大小