Swift 如果Firebase snapshot为nil,则UITableView单元格的默认值
我环顾了一下四周,我想不出这是怎么回事 如果Firebase快照返回nil 示例: 创建快照以显示我的Firebase数据库中的所有事件名称 在使用dequeReusableCell的表视图中 但是,如果快照返回nil,则tableView将返回一个单元格,其标签为“对不起,没有事件”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快照代码。如果快照使用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)
}
}