【问题标题】:Tableview array is not loaded properly in iOS Swift?在 iOS Swift 中没有正确加载 Tableview 数组?
【发布时间】: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() 添加代码

标签: ios swift firebase uitableview


【解决方案1】:

使用它。 heightForRowAt 用于单元格的高度,但您必须检查您的约束。 也可以使用 UITableViewDelegate 来使用它

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableView.automaticDimension
    }

【讨论】:

  • 我想我需要检查一下我的限制...感谢您的回答
  • @PvDev 欢迎。如果我的答案对您来说已满,请将其添加为最喜欢的答案。可以帮助他人
猜你喜欢
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
相关资源
最近更新 更多