Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如果Firebase snapshot为nil,则UITableView单元格的默认值_Swift_Uitableview_Firebase_Firebase Realtime Database - Fatal编程技术网

Swift 如果Firebase snapshot为nil,则UITableView单元格的默认值

Swift 如果Firebase snapshot为nil,则UITableView单元格的默认值,swift,uitableview,firebase,firebase-realtime-database,Swift,Uitableview,Firebase,Firebase Realtime Database,我环顾了一下四周,我想不出这是怎么回事 如果Firebase快照返回nil 示例: 创建快照以显示我的Firebase数据库中的所有事件名称 在使用dequeReusableCell的表视图中 但是,如果快照返回nil,则tableView将返回一个单元格,其标签为“对不起,没有事件” 这是我的firebase快照代码。如果快照使用print()语句返回nil,则此代码当前不会处理 func populateTableView(){ let uid = Auth.auth()

我环顾了一下四周,我想不出这是怎么回事

如果Firebase快照返回nil

示例:

创建快照以显示我的Firebase数据库中的所有事件名称 在使用dequeReusableCell的表视图中

但是,如果快照返回nil,则tableView将返回一个单元格,其标签为“对不起,没有事件”



这是我的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()
            }

        })

    }
func populateTableView(){
设uid=Auth.Auth().currentUser?.uid
ref=Database.Database().reference()
ref.child(“事件”).child(uid!).child(currentDate).observeSingleEvent(of:.值,其中:{(快照))位于
self.events=[]
如果让snapshot=snapshot.children.allObjects为?[DataSnapshot]{
用于管理单元快照{
//打印(“快照:\(快照)”)
如果让postDict=snap.value作为字典{
让key=snap.key
让事件=事件(postKey:key,postData:postDict)
self.events.append(事件)
//打印(self.events)
}
}
}
如果!snapshot.exists()存在{
self.eventStatus=false
self.tableView.reloadData()
打印(“此处无事件”)
}否则{
self.eventStatus=true
self.tableView.reloadData()
}
})
}

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

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)

    }



}
<代码>导入基础 进口火基 班级活动{ var-ref:DatabaseReference! 私有变量描述:字符串! private var_imageUrl:String! 私有变量\u事件标题:字符串! private var\u eventType:String! private var\u eventTime:String! private var\u eventStartDate:String! private var\u eventEndDate:String! private var_monthlyRepeat:字符串! 私人var_weeklyRepeat:字符串! private var\u eventColor:String! private var_postKey:String! private var\u postRef:DatabaseReference! 变量说明:字符串{ 返回描述 } var-imageUrl:String{ 返回_imageUrl } var eventTitle:String{ 返回事件标题 } var-eventType:String{ 返回事件类型 } var-eventTime:String{ 返回事件时间 } var eventStartDate:String{ 返回事件开始日期 } var eventEndDate:String{ 返回事件结束日期 } var monthlyRepeat:String{ 每月返回 } var weeklyRepeat:String{ 返回(每星期一次) } var-eventColor:String{ 返回事件颜色 } var postKey:String{ return\u postKey } init(postKey:String,postData:Dictionary){ self.\u postKey=postKey 如果let description=postData[“description”]作为?字符串{ 自我描述=描述 } 如果让imageUrl=postData[“事件\u图像\u URL”]作为?字符串{ self.\u imageUrl=imageUrl } 如果让eventTitle=postData[“event_Title”]作为字符串{ self.\u eventTitle=eventTitle } 如果让eventType=postData[“事件类型”]作为字符串{ self.\u eventType=eventType } 如果让eventTime=postData[“event_Time”]作为字符串{ self.\u eventTime=eventTime } 如果让eventStartDate=postData[“开始日期”]作为?字符串{ self.\u eventStartDate=eventStartDate } 如果让eventEndDate=postData[“结束日期”]作为字符串{ self.\u eventEndDate=eventEndDate } 如果让monthlyRepeat=postData[“monthly_Repeat”]作为字符串{ self.\u monthlyRepeat=monthlyRepeat } 如果让weeklyRepeat=postData[“weekly_Repeat”]作为字符串{ self.\u weeklyRepeat=weeklyRepeat } 如果让eventColor=postData[“color”]作为字符串{ self.\u eventColor=eventColor } 设uid=Auth.Auth().currentUser?.uid ref=Database.Database().reference() 让eventRef=ref.child(“事件”).child(uid!).child(“5月29日星期一”) _postRef=eventRef.child(\u postKey) } }
解决此问题的最简单方法是在
viewcontroller
中添加标题
UILabel
,并在快照不可用时更改文本

或者,如果出于某种原因,这对您不起作用,您可以尝试以下方法:

我没有检查这个,但我可能会让你走上正轨

首先,您需要更改
populateTableView
方法,以便创建
events
数组,即使快照没有结果。这样,即使快照没有结果,
事件
数组计数也将为1(并且一行将添加到
表视图

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")
        }
    })
}
您需要创建两个具有唯一标识符的自定义单元格

现在,您可以“实际”填充
表格视图
,如下所示:

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

我理解你的问题了吗。您正在寻求有关如何填充tableview的帮助?是的。如果Firebase快照返回为零或不存在,我正在寻找一种方法来显示某个单元格。也许我刚才输入的答案会让您开始。我还没有测试代码,所以-如果你愿意,试试看。
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)
    }
}