iOS Swift集成Firebase添加帖子时间后模拟器空白显示异常求助
问题描述
- 给原有帖子视图添加日期时间展示逻辑后,页面无法正常渲染,模拟器显示空白,代码无报错
- 预期实现文章发布时间展示功能,未添加日期相关逻辑时程序可正常运行,尝试多种方案均未解决问题
相关代码片段
1. 初始测试的日期赋值代码
if let date = document.get("date") as? String{ cell.CurrentTime.text = postArray[indexPath.row].date var date:String self.date = date
2. FeedVC 相关代码
//MARK: FIREBASE GET DATAS func getDatas(){ let firestoreDB = Firestore.firestore() firestoreDB.collection("Post").order(by: "date", descending: true).addSnapshotListener { snapshot, error in if error != nil { print(error?.localizedDescription ?? "Error while getting data from server!" ) }else{ if snapshot?.isEmpty != true && snapshot != nil { self.postArray.removeAll(keepingCapacity: false) for document in snapshot!.documents{ if let imageURL = document.get("imageUrl") as? String{ if let caption = document.get("caption") as? String{ if let email = document.get("email") as? String{ if let date = document.get("date") as? String{ let post = Post(email: email, caption: caption, imageUrl: imageURL, date: date) self.postArray.append(post) } } } } } self.tableView.reloadData() } } } }
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! FeedCell self.getUserInfo(userEmail: postArray[indexPath.row].email,cell: cell) cell.captionLabel.text = postArray[indexPath.row].caption cell.CurrentTime.text = postArray[indexPath.row].date cell.postImage.sd_setImage(with: URL(string: postArray[indexPath.row].imageUrl)) return cell } }
3. FeedCell 相关代码
import UIKit import Firebase import SDWebImage class FeedCell: UITableViewCell { @IBOutlet weak var CurrentTime: UILabel! @IBOutlet weak var userNameLabel: UILabel! @IBOutlet weak var postImage: UIImageView! @IBOutlet weak var captionLabel: UILabel! @IBOutlet weak var containerView: UIView! @IBOutlet weak var userProfileImage: UIImageView! @IBOutlet weak var cardView: UIView! override func awakeFromNib() { super.awakeFromNib() // Initialization code containerView.layer.cornerRadius = 20 cardView.layer.cornerRadius = 20 postImage.layer.masksToBounds = true containerView.layer.shadowColor = UIColor.black.cgColor containerView.layer.shadowOpacity = 0.25 containerView.layer.shadowOffset = .zero containerView.layer.shadowRadius = 10 containerView.layer.shadowPath = UIBezierPath(rect: containerView.bounds).cgPath containerView.layer.shouldRasterize = true containerView.layer.rasterizationScale = UIScreen.main.scale } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state }
4. Post 数据模型相关代码
import Foundation struct Post{ var email:String var caption:String var imageUrl:String var date:String init(email:String,caption:String,imageUrl:String,date:String) { self.email = email self.caption = caption self.imageUrl = imageUrl self.date = date } }
修复方案
- 核心问题:Firestore存储的
date字段默认是Timestamp类型,不是字符串类型,代码中用as? String强转一定会失败,直接导致所有Post对象无法通过可选绑定校验,不会被加入postArray数据源,整个过程是可选绑定静默失败,不会抛出报错,最终tableView无内容渲染显示空白。
替换date字段的解析逻辑,先按Timestamp类型取值,再格式化为需要的字符串即可:// 替换原有if let date = document.get("date") as? String的逻辑 if let timestamp = document.get("date") as? Timestamp { let dateFormatter = DateFormatter() // 可自定义需要的日期展示格式 dateFormatter.dateFormat = "yyyy-MM-dd HH:mm" let dateStr = dateFormatter.string(from: timestamp.dateValue()) let post = Post(email: email, caption: caption, imageUrl: imageURL, date: dateStr) self.postArray.append(post) } - 现有嵌套金字塔式可选绑定逻辑鲁棒性差,任意一个字段类型不匹配/缺失都会导致对应Post无法加入数据源,且难以定位问题,替换为
guard let并列解包逻辑:for document in snapshot!.documents{ guard let imageURL = document.get("imageUrl") as? String, let caption = document.get("caption") as? String, let email = document.get("email") as? String, let timestamp = document.get("date") as? Timestamp else { print("字段解析失败,文档ID:\(document.documentID)") continue } let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd HH:mm" let dateStr = dateFormatter.string(from: timestamp.dateValue()) let post = Post(email: email, caption: caption, imageUrl: imageURL, date: dateStr) self.postArray.append(post) } - 删除初始测试阶段残留的无效日期赋值代码,这段代码存在重复定义变量、无意义赋值的问题,残留会导致逻辑异常。
- 如果存在未携带
date字段的历史旧数据,order(by: "date", descending: true)会自动过滤掉这部分数据导致不展示,需要兼容的话可以给旧数据补全date字段,或者调整排序逻辑。
内容的提问来源于stack exchange,提问作者ERIC
相关产品推荐
相关产品推荐

