在 iOS Swift 中没有正确加载 Tableview 数组?
Posted
技术标签:
【中文标题】在 iOS Swift 中没有正确加载 Tableview 数组?【英文标题】:Tableview array is not loaded properly in iOS Swift? 【发布时间】:2019-07-05 10:53:37 【问题描述】:我正在使用聊天应用程序。将发送方和接收方消息保存到 Firebase。我在尝试将数组消息加载到 TableView
时遇到的问题,消息未完全加载。它显示剩余消息的间隙。
MainChatViewController.swift
var messages = [Message]()
func numberOfSections(in tableView: UITableView) -> Int
return 1
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return messages.count
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
print("message count::\(messages.count)")
let message = messages[indexPath.row]
if let cell = chatTableView.dequeueReusableCell(withIdentifier: "Message") as? mainChatScreenTableViewCell
cell.tag = indexPath.row
cell.configCell(message: message)
return cell
else
return mainChatScreenTableViewCell()
func loadData()
Database.database().reference().child("messages").child(messageId)
.observe(.value, with: (snapshot) in
if let snapshot = snapshot.children.allObjects as? [DataSnapshot]
self.messages.removeAll()
for data in snapshot
if let postDict = data.value as? Dictionary<String, AnyObject>
let key = data.key
let post = Message(messageKey: key, postData: postDict)
self.messages.append(post)
self.chatTableView.reloadData()
)
//loadData
func moveToBottom()
DispatchQueue.main.async
if self.messages.count > 0
let indexPath = IndexPath(row: self.messages.count - 1, section: 0)
self.chatTableView.scrollToRow(at: indexPath, at: .bottom, animated: false)
mainChatScreenTableViewCell
import UIKit
import SwiftKeychainWrapper
import Firebase
import FirebaseStorage
import FirebaseDatabase
class mainChatScreenTableViewCell: UITableViewCell
@IBOutlet weak var recievedMessageLbl: UILabel!
@IBOutlet weak var recievedMessageView: UIView!
@IBOutlet weak var sentMessageLbl: UILabel!
@IBOutlet weak var sentMessageView: UIView!
@IBOutlet var receivedTimeLabel: UILabel!
@IBOutlet var sentTimeLabel: UILabel!
@IBOutlet var likeOrUnlikeImageView: UIImageView!
@IBOutlet var errorImageView: UIImageView!
@IBOutlet var checkImage: UIImageView!
var message: Message!
var currentUser = KeychainWrapper.standard.string(forKey: "uid")
override func awakeFromNib()
super.awakeFromNib()
// Initialization code
sentMessageView.layer.masksToBounds = true
recievedMessageView.layer.masksToBounds = true
override func setSelected(_ selected: Bool, animated: Bool)
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
func configCell(message: Message)
self.message = message
print("message label::\(message.message.count)")
if message.sender == currentUser
let time = message.receivedTimeStamp
let timeinterval : TimeInterval = time
let dateFromServer = NSDate(timeIntervalSince1970:timeinterval)
let formatter = DateFormatter()
formatter.calendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.ISO8601) as Calendar?
formatter.locale = NSLocale(localeIdentifier: "en_IN") as Locale
formatter.timeZone = NSTimeZone(name: "GMT+5:30") as TimeZone?
formatter.dateFormat = "h:mm a"
formatter.amSymbol = "AM"
formatter.pmSymbol = "PM"
let dateString: String = formatter.string(from: dateFromServer as Date)
print("dateString:::\(dateString)")
sentMessageView.isHidden = false
sentMessageView.layer.backgroundColor = UIColor.clear.cgColor
sentMessageLbl.text = " " + message.message
sentTimeLabel.text = " " + dateString
recievedMessageLbl.text = ""
recievedMessageLbl.isHidden = true
recievedMessageView.isHidden = true
else
let time = message.receivedTimeStamp
let timeinterval : TimeInterval = time
let dateFromServer = NSDate(timeIntervalSince1970:timeinterval)
let formatter = DateFormatter()
formatter.calendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.ISO8601) as Calendar?
formatter.locale = NSLocale(localeIdentifier: "en_IN") as Locale
formatter.timeZone = NSTimeZone(name: "GMT+5:30") as TimeZone?
formatter.dateFormat = "h:mm a"
formatter.amSymbol = "AM"
formatter.pmSymbol = "PM"
let dateString: String = formatter.string(from: dateFromServer as Date)
print("dateString:::\(dateString)")
sentMessageView.isHidden = true
sentMessageLbl.isHidden = true
sentMessageLbl.text = ""
recievedMessageLbl.text = " " + message.message
receivedTimeLabel.text = " " + dateString
recievedMessageLbl.isHidden = false
recievedMessageView.layer.backgroundColor = UIColor.clear.cgColor
这是我的截图:
我得到了正确的消息计数,但消息已完全加载。
任何帮助都非常感谢...
【问题讨论】:
可以发一下tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
方法的实现吗?
@claudio 我添加了 numberOfRowsInSection。看看
mainChatScreenTableViewCell()
方法呢?这是用于任何标题或其他内容吗?
在 mainChatScreenTableViewCell() 内部我使用了 configCell(message: Message) 函数 @CodeChanger
请为 mainChatScreenTableViewCell() 添加代码
【参考方案1】:
使用它。 heightForRowAt 用于单元格的高度,但您必须检查您的约束。 也可以使用 UITableViewDelegate 来使用它
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
return UITableView.automaticDimension
【讨论】:
我想我需要检查一下我的限制...感谢您的回答 @PvDev 欢迎。如果我的答案对您来说已满,请将其添加为最喜欢的答案。可以帮助他人以上是关于在 iOS Swift 中没有正确加载 Tableview 数组?的主要内容,如果未能解决你的问题,请参考以下文章
使用 PDFKit Swift (ios)/Capacitor 加载 PDF 而不下载文件
在 WKWebView (iOS, Swift) 中使用本地 Javascript 源加载本地 HTML