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

ma​​inChatScreenTableViewCell

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) -&gt; 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

Swift 3 / iOS 10,正确使用核心数据

如何在iOS swift中水平滚动图像

从 iOS 9 / Swift 2.0 发送 HTTP POST 请求时,PHP 服务器没有收到正确的数据

为啥我的图像无法在 Swift 中正确加载