Commit 555ade9b authored by Alex朱枝文's avatar Alex朱枝文

IM列表追加到消息页以及推送跳转

parent 13f7a1f0
...@@ -72,7 +72,7 @@ extension AppDelegate: JPUSHRegisterDelegate { ...@@ -72,7 +72,7 @@ extension AppDelegate: JPUSHRegisterDelegate {
// 转换到消息tab // 转换到消息tab
YHLoginManager.shared.needJumpToMsgTabFlag = true YHLoginManager.shared.needJumpToMsgTabFlag = true
DispatchQueue.main.asyncAfter(deadline: .now() + 0.25, execute: { DispatchQueue.main.asyncAfter(deadline: .now() + 0.25, execute: {
goToMessagePage() goToMessagePage(userInfo)
}) })
} }
...@@ -113,12 +113,11 @@ extension AppDelegate: JPUSHRegisterDelegate { ...@@ -113,12 +113,11 @@ extension AppDelegate: JPUSHRegisterDelegate {
} }
// 系统要求执行这个方法 // 系统要求执行这个方法
completionHandler() completionHandler()
// 转换到消息tab // 转换到消息tab
YHLoginManager.shared.needJumpToMsgTabFlag = true YHLoginManager.shared.needJumpToMsgTabFlag = true
DispatchQueue.main.asyncAfter(deadline: .now() + 0.25, execute: { DispatchQueue.main.asyncAfter(deadline: .now() + 0.25, execute: {
goToMessagePage()
if let msgType = userInfo["msg_type"] as? Int, msgType == YHMessageType.article.rawValue { if let msgType = userInfo["msg_type"] as? Int, msgType == YHMessageType.article.rawValue {
goToMessagePage()
let model = YHNewsModel() let model = YHNewsModel()
model.id = userInfo["msg_id"] as? String ?? "" model.id = userInfo["msg_id"] as? String ?? ""
model.article_id = userInfo["article_id"] as? Int ?? 0 model.article_id = userInfo["article_id"] as? Int ?? 0
...@@ -129,7 +128,10 @@ extension AppDelegate: JPUSHRegisterDelegate { ...@@ -129,7 +128,10 @@ extension AppDelegate: JPUSHRegisterDelegate {
model.media_transcode_url = userInfo["media_transcode_url"] as? String ?? "" model.media_transcode_url = userInfo["media_transcode_url"] as? String ?? ""
yh_newsList.enterDetail(model) yh_newsList.enterDetail(model)
yh_newsList.markRead(model) yh_newsList.markRead(model)
} else {
goToMessagePage(userInfo)
} }
}) })
} }
......
...@@ -146,7 +146,7 @@ class YHCommunityViewController: YHBaseViewController { ...@@ -146,7 +146,7 @@ class YHCommunityViewController: YHBaseViewController {
make.edges.equalToSuperview() make.edges.equalToSuperview()
} }
NotificationCenter.default.addObserver(self, selector: #selector(goMessageListVC), name: YhConstant.YhNotification.goMessageVCNotifiction, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(goMessageListVC(_:)), name: YhConstant.YhNotification.goMessageVCNotifiction, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(goActivityVC), name: YhConstant.YhNotification.goActivityVCNotifiction, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(goActivityVC), name: YhConstant.YhNotification.goActivityVCNotifiction, object: nil)
...@@ -271,8 +271,17 @@ class YHCommunityViewController: YHBaseViewController { ...@@ -271,8 +271,17 @@ class YHCommunityViewController: YHBaseViewController {
} }
} }
@objc func goMessageListVC() { @objc func goMessageListVC(_ notification: Notification) {
segmentedView.selectItemAt(index: 0) segmentedView.selectItemAt(index: 0)
guard let userInfo = notification.userInfo else {
return
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.15) {
guard let messageListVC = self.arrItemVCs[0] as? YHMessageListVC else {
return
}
messageListVC.handleRemoteNotification(userInfo)
}
} }
@objc func goActivityVC() { @objc func goActivityVC() {
......
...@@ -8,9 +8,13 @@ ...@@ -8,9 +8,13 @@
import UIKit import UIKit
import JXSegmentedView import JXSegmentedView
import TUIConversation
import TUIChat
import IQKeyboardManagerSwift
import GKNavigationBarSwift
class YHMessageListVC: YHBaseViewController { class YHMessageListVC: YHBaseViewController {
private let messageListManager = YHTUIMessageListManager.shared
var msgArr: [YHMessageInfoModel] = [] var msgArr: [YHMessageInfoModel] = []
lazy var viewModel = { lazy var viewModel = {
let model = YHMsgViewModel() let model = YHMsgViewModel()
...@@ -24,6 +28,11 @@ class YHMessageListVC: YHBaseViewController { ...@@ -24,6 +28,11 @@ class YHMessageListVC: YHBaseViewController {
var isNotifyEnabled = false var isNotifyEnabled = false
private lazy var previewFileTool: YHFilePreviewTool = {
let tool = YHFilePreviewTool(targetVC: self)
return tool
}()
lazy var tableView: UITableView = { lazy var tableView: UITableView = {
let tableView = UITableView(frame: .zero, style: .grouped) let tableView = UITableView(frame: .zero, style: .grouped)
tableView.estimatedSectionHeaderHeight = 1.0 tableView.estimatedSectionHeaderHeight = 1.0
...@@ -99,6 +108,7 @@ class YHMessageListVC: YHBaseViewController { ...@@ -99,6 +108,7 @@ class YHMessageListVC: YHBaseViewController {
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
setupUI() setupUI()
setupMessageList()
} }
override func viewWillAppear(_ animated: Bool) { override func viewWillAppear(_ animated: Bool) {
...@@ -119,7 +129,7 @@ class YHMessageListVC: YHBaseViewController { ...@@ -119,7 +129,7 @@ class YHMessageListVC: YHBaseViewController {
// 银河管家 始终放在第一位 // 银河管家 始终放在第一位
if YHButlerServiceManager.shared.isUatAllowed() { if YHButlerServiceManager.shared.isUatAllowed() {
msgArr.append(self.managerSession) msgArr.insert(self.managerSession, at: 0)
} }
self.tableView.reloadData() self.tableView.reloadData()
...@@ -146,6 +156,29 @@ class YHMessageListVC: YHBaseViewController { ...@@ -146,6 +156,29 @@ class YHMessageListVC: YHBaseViewController {
NotificationCenter.default.addObserver(self, selector: #selector(didRefreshYinHeManagerUnreadMsg), name: YhConstant.YhNotification.didQiYuUnReadMsgCountChangeNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(didRefreshYinHeManagerUnreadMsg), name: YhConstant.YhNotification.didQiYuUnReadMsgCountChangeNotification, object: nil)
} }
private func setupMessageList() {
// 设置代理
messageListManager.delegate = self
// 首次加载消息列表
messageListManager.refreshMessageList()
}
// 处理置顶
func pinConversation(_ message: TUIConversationCellData) {
messageListManager.pinConversation(message, isPinned: !message.isOnTop)
}
// 处理已读
func markAsRead(_ message: TUIConversationCellData) {
messageListManager.markAsRead(message)
}
// 处理删除
func deleteConversation(_ message: TUIConversationCellData) {
messageListManager.deleteConversation(message)
}
deinit { deinit {
NotificationCenter.default.removeObserver(self) NotificationCenter.default.removeObserver(self)
} }
...@@ -194,14 +227,14 @@ class YHMessageListVC: YHBaseViewController { ...@@ -194,14 +227,14 @@ class YHMessageListVC: YHBaseViewController {
guard let self = self else { return } guard let self = self else { return }
// 保留第一个元素银河管家,删除其他元素 // 保留第一个元素银河管家,删除其他元素
msgArr.removeAll() msgArr.removeAll(where: { $0.conversationID == "" })
if YHButlerServiceManager.shared.isUatAllowed() { if YHButlerServiceManager.shared.isUatAllowed() {
self.managerSession.unreadCount = YHButlerServiceManager.shared.unreadCount self.managerSession.unreadCount = YHButlerServiceManager.shared.unreadCount
if let lastMsg = YHButlerServiceManager.shared.getLastMessage() { if let lastMsg = YHButlerServiceManager.shared.getLastMessage() {
self.managerSession.lastMessage = lastMsg.content self.managerSession.lastMessage = lastMsg.content
self.managerSession.lastMessageTime = Int64(lastMsg.timeStamp) self.managerSession.lastMessageTime = Int64(lastMsg.timeStamp)
} }
msgArr.append(self.managerSession) msgArr.insert(self.managerSession, at: 0)
} }
// 银河资讯 // 银河资讯
...@@ -302,6 +335,11 @@ class YHMessageListVC: YHBaseViewController { ...@@ -302,6 +335,11 @@ class YHMessageListVC: YHBaseViewController {
func markAllMsgsRead() { func markAllMsgsRead() {
// 清除银河管家未读消息数 // 清除银河管家未读消息数
YHButlerServiceManager.shared.clearUnreadCount() YHButlerServiceManager.shared.clearUnreadCount()
// 清理im未读消息
let list = messageListManager.getMessageList()
list.forEach {
messageListManager.markAsRead($0)
}
YHHUD.show(.progress(message: "清除中...")) YHHUD.show(.progress(message: "清除中..."))
self.viewModel.readMessages(type: nil, msgIds: nil, isAllRead: true) { self.viewModel.readMessages(type: nil, msgIds: nil, isAllRead: true) {
...@@ -412,6 +450,60 @@ extension YHMessageListVC { ...@@ -412,6 +450,60 @@ extension YHMessageListVC {
}) })
} }
} }
func handleRemoteNotification(_ userInfo: [AnyHashable: Any]) {
let extString = userInfo["ext"] as? String ?? "{}"
let extData = extString.data(using: .utf8) ?? Data()
let ext = (try? JSONSerialization.jsonObject(with: extData, options: [])) as? [String: Any] ?? [:]
let entity = ext["entity"] as? [String: Any] ?? [:]
let chatType = entity["chatType"] as? Int ?? 0 // 1: 单聊, 2: 群聊
let senderID = entity["sender"] as? String ?? ""
let nickName = entity["nickname"] as? String ?? ""
let aps = userInfo["aps"] as? [String: Any] ?? [:]
let alert = aps["alert"] as? [String: Any] ?? [:]
let title = alert["title"] as? String ?? nickName // 备用昵称
guard senderID.count > 0 else {
return
}
updateNavigateBarBeforeEnterChatVC()
var param: [String: Any] = [
TUICore_TUIChatObjectFactory_ChatViewController_Title: title,
TUICore_TUIChatObjectFactory_ChatViewController_AvatarUrl: "", // 通知无头像 URL
TUICore_TUIChatObjectFactory_ChatViewController_AtTipsStr: "",
TUICore_TUIChatObjectFactory_ChatViewController_AtMsgSeqs: [],
TUICore_TUIChatObjectFactory_ChatViewController_Draft: ""
]
// 5. 区分单聊/群聊
if chatType == 2 { // 群聊
param[TUICore_TUIChatObjectFactory_ChatViewController_GroupID] = senderID
param[TUICore_TUIChatObjectFactory_ChatViewController_ConversationID] = "group_\(senderID)"
} else { // 单聊
param[TUICore_TUIChatObjectFactory_ChatViewController_UserID] = senderID
param[TUICore_TUIChatObjectFactory_ChatViewController_ConversationID] = "c2c_\(senderID)"
}
// 3. 跳转
let vc = navigationController?.push(TUICore_TUIChatObjectFactory_ChatViewController_Classic, param: param, forResult: nil)
if let vc = vc as? TUIBaseChatViewController {
vc.filePreviewDelegate = self
}
}
private func updateNavigateBarBeforeEnterChatVC() {
IQKeyboardManager.shared.isEnabled = false
navigationController?.gk_hideNavigationBar = false
navigationController?.isNavigationBarHidden = false
let appearance = UINavigationBarAppearance()
appearance.backgroundColor = .white // 背景色
appearance.shadowImage = UIImage() // 移除黑线
appearance.shadowColor = .clear // 或直接设置阴影颜色为透明
navigationController?.navigationBar.tintColor = .black // 返回图标颜色
navigationController?.navigationBar.standardAppearance = appearance
navigationController?.navigationBar.scrollEdgeAppearance = appearance
}
} }
extension YHMessageListVC: UITableViewDelegate, UITableViewDataSource { extension YHMessageListVC: UITableViewDelegate, UITableViewDataSource {
...@@ -458,6 +550,28 @@ extension YHMessageListVC: UITableViewDelegate, UITableViewDataSource { ...@@ -458,6 +550,28 @@ extension YHMessageListVC: UITableViewDelegate, UITableViewDataSource {
} }
} }
return return
} else if msgItem.type == YHMessageType.txIM.rawValue {
let item = msgArr[indexPath.row]
guard let data = messageListManager.getMessageList().first(where: { $0.conversationID == item.conversationID }) else {
return
}
updateNavigateBarBeforeEnterChatVC()
let param: [String: Any] = [
TUICore_TUIChatObjectFactory_ChatViewController_Title: data.title,
TUICore_TUIChatObjectFactory_ChatViewController_UserID: data.userID,
TUICore_TUIChatObjectFactory_ChatViewController_GroupID: data.groupID,
TUICore_TUIChatObjectFactory_ChatViewController_AvatarImage: data.avatarImage,
TUICore_TUIChatObjectFactory_ChatViewController_AvatarUrl: data.faceUrl,
TUICore_TUIChatObjectFactory_ChatViewController_ConversationID: data.conversationID,
TUICore_TUIChatObjectFactory_ChatViewController_AtTipsStr: data.atTipsStr,
TUICore_TUIChatObjectFactory_ChatViewController_AtMsgSeqs: data.atMsgSeqs,
TUICore_TUIChatObjectFactory_ChatViewController_Draft: data.draftText
]
let vc = navigationController?.push(TUICore_TUIChatObjectFactory_ChatViewController_Classic, param: param, forResult: nil)
if let vc = vc as? TUIBaseChatViewController {
vc.filePreviewDelegate = self
}
return
} }
if msgItem.type == YHMessageType.article.rawValue { // 银河资讯 if msgItem.type == YHMessageType.article.rawValue { // 银河资讯
...@@ -537,3 +651,72 @@ extension YHMessageListVC: JXSegmentedListContainerViewListDelegate { ...@@ -537,3 +651,72 @@ extension YHMessageListVC: JXSegmentedListContainerViewListDelegate {
return view return view
} }
} }
// MARK: - YHMessageListDelegate
extension YHMessageListVC: YHMessageListDelegate {
func onMessageSelected(message: TUIConversationCellData) {
// 处理消息选中,如打开聊天页面
}
private func mergeConversations(_ newConversations: [TUIConversationCellData]) {
var convertedItems = newConversations.map { conversation -> YHMessageInfoModel in
YHMessageInfoModel(
unreadCount: Int(conversation.unreadCount),
lastMessage: conversation.subTitle.string,
lastMessageTime: Int64(conversation.time.timeIntervalSince1970),
type: YHMessageType.txIM.rawValue,
title: conversation.title,
avatar: conversation.faceUrl,
conversationID: conversation.conversationID,
userID: conversation.userID,
groupID: conversation.groupID,
orderKey: Int64(conversation.orderKey),
isPinned: conversation.isOnTop,
isNotDisturb: conversation.isNotDisturb,
isOnline: conversation.onlineStatus == .online,
draftText: conversation.draftText,
attributedSubtitle: conversation.subTitle,
avatarImage: conversation.avatarImage,
groupType: conversation.groupType
)
}
msgArr.removeAll(where: { $0.type == YHMessageType.txIM.rawValue })
convertedItems.sort { $0.lastMessageTime > $1.lastMessageTime }
if msgArr.count > 0 {
msgArr.insert(contentsOf: convertedItems, at: 1)
} else {
msgArr.insert(contentsOf: convertedItems, at: 0)
}
tableView.reloadData()
}
func onMessageListDataSourceChanged() {
let messages = messageListManager.getMessageList()
mergeConversations(messages)
}
func onUnreadCountChanged(unreadCount: Int, hideUnreadCount: Int) {
// totalUnreadCount = unreadCount + hideUnreadCount
// 更新未读数显示
// updateUnreadBadge()
}
// 可选实现:自定义消息显示文本
func getCustomMessageDisplay(conversation: V2TIMConversation) -> String? {
// 根据需要自定义会话的显示文本
return nil
}
}
extension YHMessageListVC: TUICustomOpenFileDelegate {
func didTap(inFileCell cellData: TUIFileMessageCellData) {
var isExist: ObjCBool = false
let path = cellData.getFilePath(&isExist)
if isExist.boolValue {
let url = URL(fileURLWithPath: path)
previewFileTool.openXLSXFile(at: url, fileName: cellData.fileName)
} else {
cellData.downloadFile()
}
}
}
...@@ -23,6 +23,7 @@ enum YHMessageType: Int { ...@@ -23,6 +23,7 @@ enum YHMessageType: Int {
case article = 10 // 资讯 case article = 10 // 资讯
case yinheManager = 9527 // 银河管家 case yinheManager = 9527 // 银河管家
case txIM = 9528 // im聊天
} }
class YHMessageInfoModel: SmartCodable { class YHMessageInfoModel: SmartCodable {
...@@ -30,10 +31,61 @@ class YHMessageInfoModel: SmartCodable { ...@@ -30,10 +31,61 @@ class YHMessageInfoModel: SmartCodable {
var lastMessage: String = "" var lastMessage: String = ""
var lastMessageTime: Int64 = 0 var lastMessageTime: Int64 = 0
var type: Int = 0 var type: Int = 0
var title: String = ""
var avatar: String = ""
var conversationID: String = ""
var userID: String = ""
var groupID: String = ""
var orderKey: Int64 = 0
var isPinned: Bool = false
var isNotDisturb: Bool = false
var isOnline: Bool = false
var draftText: String = ""
var attributedSubtitle: NSAttributedString = NSAttributedString()
var avatarImage: UIImage?
var groupType: String = ""
required init() { required init() {
} }
init(
unreadCount: Int = 0,
lastMessage: String = "",
lastMessageTime: Int64 = 0,
type: Int = 0,
title: String = "",
avatar: String = "",
conversationID: String = "",
userID: String = "",
groupID: String = "",
orderKey: Int64 = 0,
isPinned: Bool = false,
isNotDisturb: Bool = false,
isOnline: Bool = false,
draftText: String = "",
attributedSubtitle: NSAttributedString = NSAttributedString(),
avatarImage: UIImage?,
groupType: String
) {
self.unreadCount = unreadCount
self.lastMessage = lastMessage
self.lastMessageTime = lastMessageTime
self.type = type
self.title = title
self.avatar = avatar
self.conversationID = conversationID
self.userID = userID
self.groupID = groupID
self.orderKey = orderKey
self.isPinned = isPinned
self.isNotDisturb = isNotDisturb
self.isOnline = isOnline
self.draftText = draftText
self.attributedSubtitle = attributedSubtitle
self.avatarImage = avatarImage
self.groupType = groupType
}
enum CodingKeys: String, CodingKey { enum CodingKeys: String, CodingKey {
case unreadCount = "unread_count" case unreadCount = "unread_count"
...@@ -77,6 +129,9 @@ class YHMessageInfoModel: SmartCodable { ...@@ -77,6 +129,9 @@ class YHMessageInfoModel: SmartCodable {
} else if type == YHMessageType.article.rawValue { } else if type == YHMessageType.article.rawValue {
return "银河资讯" return "银河资讯"
} else if type == YHMessageType.txIM.rawValue {
return title
} }
return "" return ""
} }
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
// //
import UIKit import UIKit
import TUICore
class YHMessageSessionCell: UITableViewCell { class YHMessageSessionCell: UITableViewCell {
...@@ -69,6 +70,9 @@ class YHMessageSessionCell: UITableViewCell { ...@@ -69,6 +70,9 @@ class YHMessageSessionCell: UITableViewCell {
self.iconImgView.image = UIImage(named: "msg_icon_news") self.iconImgView.image = UIImage(named: "msg_icon_news")
self.iconContentView.backgroundColor = UIColor(hex: 0xF0F5FF) self.iconContentView.backgroundColor = UIColor(hex: 0xF0F5FF)
} else if model.type == YHMessageType.txIM.rawValue {
// self.iconImgView.kf.setImage(with: URL(string: model.avatar), placeholder: model.avatarImage ?? UIImage(named: "people_head_default"))
updatePortrait(convData: model)
} }
self.badgeLabel.isHidden = model.unreadCount <= 0 self.badgeLabel.isHidden = model.unreadCount <= 0
...@@ -86,15 +90,21 @@ class YHMessageSessionCell: UITableViewCell { ...@@ -86,15 +90,21 @@ class YHMessageSessionCell: UITableViewCell {
} }
make.width.equalTo(width) make.width.equalTo(width)
} }
let isBigIcon = model.type == YHMessageType.yinheManager.rawValue || model.type == YHMessageType.txIM.rawValue
self.iconImgView.snp.updateConstraints { make in self.iconImgView.snp.updateConstraints { make in
let width = model.type == YHMessageType.yinheManager.rawValue ? 44.0 : 21.0 let width = isBigIcon ? 44.0 : 21.0
let height = model.type == YHMessageType.yinheManager.rawValue ? 44.0 : 21.0 let height = isBigIcon ? 44.0 : 21.0
make.width.equalTo(width) make.width.equalTo(width)
make.height.equalTo(height) make.height.equalTo(height)
} }
self.detailLabel.text = !model.lastMessage.isEmpty ? model.lastMessage : "暂无消息".local if model.type == YHMessageType.txIM.rawValue {
let attr = NSMutableAttributedString(attributedString: model.attributedSubtitle)
attr.setAttributes([.foregroundColor: UIColor.mainTextColor50, .font: UIFont.PFSC_R(ofSize: 12)], range: NSRange(location: 0, length: attr.string.count))
self.detailLabel.attributedText = !attr.string.isEmpty ? attr : NSAttributedString(string: "暂无消息".local, attributes: [.foregroundColor: UIColor.mainTextColor50, .font: UIFont.PFSC_R(ofSize: 12)])
} else {
self.detailLabel.text = !model.lastMessage.isEmpty ? model.lastMessage : "暂无消息".local
}
self.timeLabel.text = formatTimestamp(Double(model.lastMessageTime)) self.timeLabel.text = formatTimestamp(Double(model.lastMessageTime))
self.timeLabel.isHidden = model.lastMessage.isEmpty self.timeLabel.isHidden = model.lastMessage.isEmpty
} }
...@@ -124,6 +134,51 @@ class YHMessageSessionCell: UITableViewCell { ...@@ -124,6 +134,51 @@ class YHMessageSessionCell: UITableViewCell {
return dateFormatter.string(from: date) return dateFormatter.string(from: date)
} }
private func updatePortrait(convData: YHMessageInfoModel) {
if !convData.groupID.isEmpty {
// Group avatar
if !convData.avatar.isEmpty {
// Group avatar has been manually set externally
self.iconImgView.kf.setImage(with: URL(string: convData.avatar), placeholder: convData.avatarImage ?? UIImage(named: "people_head_default"))
} else {
if TUIConfig.default().enableGroupGridAvatar {
// Use synthetic avatar
self.iconImgView.image = convData.avatarImage ?? UIImage(named: "people_head_default")
TUIGroupAvatar.getCacheGroupAvatar(convData.groupID) { [weak self] (avatar, callbackGroupID) in
guard let self = self else { return }
if callbackGroupID == convData.groupID {
if let avatar = avatar {
// Cache hit
self.iconImgView.image = avatar
} else {
// Need to synthesize new avatar
self.iconImgView.image = convData.avatarImage ?? UIImage(named: "people_head_default")
let placeholderImage = convData.avatarImage ?? UIImage(named: "people_head_default") ?? UIImage()
TUIGroupAvatar.fetchGroupAvatars(convData.groupID, placeholder: placeholderImage) { [weak self] (success, image, fetchGroupID) in
guard let self = self else { return }
if fetchGroupID == convData.groupID {
let placeholder = success ? image : TUIConfig.default().getGroupAvatarImage(byGroupType: convData.groupType)
self.iconImgView.image = placeholder
}
// Ignore if cell has been reused
}
}
}
// Ignore if cell has been reused
}
} else {
// Synthetic avatars not allowed, use default
self.iconImgView.image = convData.avatarImage ?? UIImage(named: "people_head_default")
}
}
} else {
self.iconImgView.kf.setImage(with: URL(string: convData.avatar), placeholder: convData.avatarImage ?? UIImage(named: "people_head_default"))
}
}
func setupUI() { func setupUI() {
self.selectionStyle = .none self.selectionStyle = .none
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment