【发布时间】:2020-11-29 03:41:15
【问题描述】:
在我的应用程序中,我已经成功地从视频 url 创建了缩略图图像并显示在表格单元格中,但问题是当我滚动表格视图单元格时,缩略图图像不断变化。如何解决这个问题。请帮我解决这个问题,因为我尝试过搜索但没有运气
我的代码尝试过: 我的单元类代码:-
class VideoCell: UITableViewCell {
static let cellID = "VideoCell"
//MARK:- Outlets
@IBOutlet weak var videoThumbImage: UIImageViewX!
@IBOutlet weak var dateLbl: UILabel!
@IBOutlet weak var mainView: UIViewX!
@IBOutlet weak var userProfileImage: UIImageViewX!
@IBOutlet weak var playBtn: UIButton!
//MARK:- Properties
var chatObj:ModelOldMessagesMessages? {
didSet {
configure()
}
}
//MARK:- Life Cycle
override func awakeFromNib() {
super.awakeFromNib()
self.mainView.layer.cornerRadius = 10
self.mainView.layer.maskedCorners = [.layerMaxXMaxYCorner,.layerMaxXMinYCorner,.layerMinXMaxYCorner]
}
//MARK:- Helpers
private func configure() {
guard let obj = chatObj else {return}
if let msgStr = obj.chatMsgText, let time = obj.chatMsgDatetime, time.count > 0, msgStr.count > 0 {
let time = convertUTCToLocal(timeString: time)
self.dateLbl.text = changeDateForamte(time!, conVertFormate: "hh:mm a", currentDateFormate: "yyyy-MM-dd HH:mm:ss ")
let imgStr = WS_Chat_DownloadFile + msgStr
let url = URL(string: imgStr)!
self.getThumbnailImageFrom(fileUrl: url) { (image) in
self.videoThumbImage.image = image
}
}
if let tmpImgURL = obj.adminImage, tmpImgURL.count > 0 {
let img = WS_DownloadImage + tmpImgURL
self.userProfileImage.loadImage(img)
}
}
fileprivate func getThumbnailImageFrom(fileUrl: URL, completion: @escaping (_ image: UIImage?) -> Void){
DispatchQueue.global().async {
let asset = AVAsset(url: fileUrl)
let imgGenerator = AVAssetImageGenerator(asset: asset)
imgGenerator.appliesPreferredTrackTransform = true
let thumbnailTime = CMTimeMake(value: 2, timescale: 1)
do {
let thumbnailCGImage = try imgGenerator.copyCGImage(at: thumbnailTime, actualTime: nil)
let finalImage = UIImage(cgImage: thumbnailCGImage)
DispatchQueue.main.async {
completion(finalImage)
}
} catch let err {
print(err.localizedDescription)
DispatchQueue.main.async {
completion(nil)
}
}
}
}
我的 cellforrow 函数
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let dict = oldMessageArr[indexPath.row]
let videoCell = tableView.dequeueReusableCell(withIdentifier: VideoCell.cellID) as! VideoCell
videoCell.chatObj = dict
videoCell.playBtn.tag = indexPath.row
videoCell.playBtn.addTarget(self, action: #selector(handlePlayBtn), for: .touchUpInside)
return videoCell
}
根据计时器调用聊天 api 的主控制器类文件代码:
//MARK:- Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
registerCell()
setupRefreshControl()
}
override func viewWillAppear(_ animated: Bool) {
WS_GetOldMessagesAPI()
self.newMessagesLoadTimer.invalidate()
}
func setupRefreshControl() {
refresher.tintColor = .black
refresher.addTarget(self, action: #selector(refreshData), for: .valueChanged)
self.tableView.addSubview(refresher)
}
@objc func refreshData() {
self.WS_GetOldMessagesAPI()
}
@objc func timerAction() {
self.newMessagesLoadTimer.invalidate()
self.WS_getNewMessage()
}
func WS_getNewMessage()
{
var url = String()
let model = ApiUtillity.sharedInstance.getLoginModel()
if let c_id = model?.loginDataResult?.chatRoomsId {
self.chatRoomId = c_id
}
var offset = Int()
let dict = oldMessageArr.last
if let offID = dict?.chatMsgId {
offset = offID
}
url = WS_GET_OldChatMessage+"\(chatRoomId)"+"?"+"offsetID=\(offset)"
APIClient<ModelBaseOldMessages>().API_GET(Url: url, Params: noParams, Authentication: true, Progress: false, Alert: true, Offline: false, SuperVC: self, completionSuccess: { (modelResponse) in
if(modelResponse.success == true) {
if offset == 0 {
self.getNewMessageArr.removeAll()
if let data = modelResponse.oldMessagesMessages, data.count != 0 {
for item in data {
if let id = item.chatMsgId, self.newMessageIDsArr.contains(id) == false {
self.newMessageIDsArr.append(id)
self.getNewMessageArr.append(item)
self.tableView.scrollToBottom()
}
}
self.newMessagesLoadTimer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(self.timerAction), userInfo: nil, repeats: true)
self.tableView.reloadData()
}
} else {
if let data = modelResponse.oldMessagesMessages, data.count != 0 {
for item in data {
if let id = item.chatMsgId, self.newMessageIDsArr.contains(id) == false {
self.newMessageIDsArr.append(id)
self.getNewMessageArr.append(item)
}
}
self.newMessagesLoadTimer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(self.timerAction), userInfo: nil, repeats: true)
self.tableView.reloadData()
}
}
} else {
self.newMessagesLoadTimer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(self.timerAction), userInfo: nil, repeats: true)
self.tableView.reloadData()
}
}) { (failed) in
self.tableView.reloadData()
}
}
func WS_GetOldMessagesAPI() {
var url = String()
var offset = Int()
let model = ApiUtillity.sharedInstance.getLoginModel()
if let c_id = model?.loginDataResult?.chatRoomsId {
self.chatRoomId = c_id
}
let dict = oldMessageArr.first
if let offID = dict?.chatMsgId {
offset = offID
}
url = WS_GET_OldChatMessage+"\(chatRoomId)"+"?"+"offsetID=\(offset)"
APIClient<ModelBaseOldMessages>().API_GET(Url: url, Params: noParams, Authentication: true, Progress: true, Alert: true, Offline: false, SuperVC: self, completionSuccess: { (modelResponse) in
print("---------------------")
print("Result:",modelResponse.toJSONString(prettyPrint: true)!)
print("---------------------")
if(modelResponse.success == true) {
if let data = modelResponse.oldMessagesMessages, data.count != 0 {
let neweReverseData = data.reversed()
for item in neweReverseData
{
if let id = item.chatMsgId, self.oldMessageIDsArr.contains(id) == false
{
self.oldMessageIDsArr.insert(id, at: 0)
self.oldMessageArr.insert(item, at: 0)
}
}
self.refresher.endRefreshing()
self.reloadTable()
self.tableView.scrollToRow(at: IndexPath.init(row: data.count - 1, section: 0), at: .top, animated: false)
}
self.WS_getNewMessage()
} else {
self.refresher.endRefreshing()
self.reloadTable()
}
}) { (failed) in
self.refresher.endRefreshing()
self.reloadTable()
}
}
【问题讨论】:
-
请帮我解决这个问题
-
显示
cellForRowAt函数。您可能没有清理数据以供单元格重复使用。 -
在行的单元格中,我只是分配像 videocell.chatobj = oldmessages[indexpath.row] 这样的数据
-
现在我应该在哪里更改我上面的代码先生