Files
featherVoice/TUIKit/TUIConversation/UI_Classic/UI/TUIConversationTableView.m

624 lines
33 KiB
Mathematica
Raw Normal View History

2025-08-08 10:49:36 +08:00
//
// TUIConversationTableView.m
// TUIConversation
//
// Created by xiangzhang on 2023/3/17.
// Copyright © 2023 Tencent. All rights reserved.
//
#import "TUIConversationTableView.h"
#import <TIMCommon/TUISecondConfirm.h>
#import <TUICore/TUICore.h>
#import "TUIConversationCell.h"
#import "TUIFoldListViewController.h"
#import "TUIConversationConfig.h"
@interface TUIConversationTableView () <UITableViewDelegate, UITableViewDataSource, TUIConversationListDataProviderDelegate>
@property(nonatomic, strong) UIImageView *tipsView;
@property(nonatomic, strong) UILabel *tipsLabel;
@property (nonatomic, assign) BOOL hideMarkReadAction;
@property (nonatomic, assign) BOOL hideDeleteAction;
@property (nonatomic, assign) BOOL hideHideAction;
@property (nonatomic, strong) NSArray *customizedItems;
@end
@implementation TUIConversationTableView {
TUIConversationListBaseDataProvider *_dataProvider;
}
- (instancetype)init {
self = [super init];
if (self) {
[self setTableView];
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self setTableView];
}
return self;
}
- (void)setFrame:(CGRect)frame {
[super setFrame:frame];
[self setTipsViewFrame];
}
- (void)setTableView {
self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
// self.backgroundColor = TUIConversationDynamicColor(@"conversation_bg_color", @"#FFFFFF");
self.backgroundColor = [UIColor clearColor];
self.tableFooterView = [[UIView alloc] init];
self.contentInset = UIEdgeInsetsMake(0, 0, 8, 0);
[self registerClass:[TUIConversationCell class] forCellReuseIdentifier:gConversationCell_ReuseId];
self.estimatedRowHeight = TConversationCell_Height;
self.rowHeight = TConversationCell_Height;
self.delaysContentTouches = NO;
[self setSeparatorColor:TIMCommonDynamicColor(@"separator_color", @"#DBDBDB")];
self.delegate = self;
self.dataSource = self;
[self addSubview:self.tipsView];
[self addSubview:self.tipsLabel];
self.disableMoreActionExtension = NO;
[self setTipsViewFrame];
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(onFriendInfoChanged:) name:@"FriendInfoChangedNotification" object:nil];
}
- (void)onFriendInfoChanged:(NSNotification *)notice {
V2TIMFriendInfo *friendInfo = notice.object;
if (friendInfo == nil) {
return;
}
for (TUIConversationCellData *cellData in self.dataProvider.conversationList) {
if ([cellData.userID isEqualToString:friendInfo.userID]) {
NSString *title = friendInfo.friendRemark;
if (title.length == 0) {
title = friendInfo.userFullInfo.nickName;
}
if (title.length == 0) {
title = friendInfo.userID;
}
cellData.title = title;
[self reloadData];
break;
}
}
}
- (UIImageView *)tipsView {
if (!_tipsView) {
_tipsView = [[UIImageView alloc] init];
_tipsView.image = TUIConversationDynamicImage(@"no_conversation_img", [UIImage imageNamed:TUIConversationImagePath(@"no_conversation")]);
_tipsView.hidden = YES;
}
return _tipsView;
}
- (UILabel *)tipsLabel {
if (!_tipsLabel) {
_tipsLabel = [[UILabel alloc] init];
_tipsLabel.textColor = TIMCommonDynamicColor(@"nodata_tips_color", @"#999999");
_tipsLabel.font = [UIFont systemFontOfSize:14.0];
_tipsLabel.textAlignment = NSTextAlignmentCenter;
_tipsLabel.hidden = YES;
}
return _tipsLabel;
}
- (void)setTipsViewFrame {
self.tipsView.mm_width(128).mm_height(109).mm__centerX(self.mm_centerX).mm__centerY(self.mm_centerY - 60);
self.tipsLabel.mm_width(300).mm_height(20).mm__centerX(self.mm_centerX).mm_top(self.tipsView.mm_maxY + 18);
}
- (void)updateTipsViewStatus {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (0 == self.dataProvider.conversationList.count) {
self.tipsView.hidden = NO;
self.tipsLabel.hidden = NO;
self.tipsLabel.text = self.tipsMsgWhenNoConversation;
} else {
self.tipsView.hidden = YES;
self.tipsLabel.hidden = YES;
}
});
}
- (void)setDataProvider:(TUIConversationListBaseDataProvider *)dataProvider {
_dataProvider = dataProvider;
if (_dataProvider) {
_dataProvider.delegate = self;
[_dataProvider loadNexPageConversations];
}
}
- (TUIConversationListBaseDataProvider *)dataProvider {
return _dataProvider;
;
}
- (void)dealloc {
[NSNotificationCenter.defaultCenter removeObserver:self];
}
#pragma mark TUIConversationListDataProviderDelegate
- (void)insertConversationsAtIndexPaths:(NSArray *)indexPaths {
if (!NSThread.isMainThread) {
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf insertConversationsAtIndexPaths:indexPaths];
});
return;
}
[UIView performWithoutAnimation:^{
[self insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
}];
}
- (void)reloadConversationsAtIndexPaths:(NSArray *)indexPaths {
if (!NSThread.isMainThread) {
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf reloadConversationsAtIndexPaths:indexPaths];
});
return;
}
if (self.isEditing) {
self.editing = NO;
}
[UIView performWithoutAnimation:^{
[self reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
}];
}
- (void)deleteConversationAtIndexPaths:(NSArray *)indexPaths {
if (!NSThread.isMainThread) {
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf deleteConversationAtIndexPaths:indexPaths];
});
return;
}
[self deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
}
- (void)reloadAllConversations {
if (!NSThread.isMainThread) {
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf reloadAllConversations];
});
return;
}
[self reloadData];
}
- (void)updateMarkUnreadCount:(NSInteger)markUnreadCount markHideUnreadCount:(NSInteger)markHideUnreadCount {
if (self.unreadCountChanged) {
self.unreadCountChanged(markUnreadCount, markHideUnreadCount);
}
}
- (void)parseActionHiddenTagAndCustomizedItems:(TUIConversationCellData *)cellData {
id<TUIConversationConfigDataSource> dataSource = [TUIConversationConfig sharedConfig].moreMenuDataSource;
NSArray *customizedItems = @[];
if (dataSource && [dataSource respondsToSelector:@selector(conversationShouldHideItemsInMoreMenu:)]) {
NSInteger flag = [dataSource conversationShouldHideItemsInMoreMenu:cellData];
self.hideDeleteAction = flag & TUIConversationItemInMoreMenu_Delete;
self.hideMarkReadAction = flag & TUIConversationItemInMoreMenu_MarkRead;
self.hideHideAction = flag & TUIConversationItemInMoreMenu_Hide;
}
if (dataSource && [dataSource respondsToSelector:@selector(conversationShouldAddNewItemsToMoreMenu:)]) {
NSArray *items = [dataSource conversationShouldAddNewItemsToMoreMenu:cellData];
if ([items isKindOfClass:NSArray.class] && items.count > 0) {
self.customizedItems = items;
}
}
}
#pragma mark - Table view data source
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
[self.dataProvider loadNexPageConversations];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGFloat offsetY = scrollView.contentOffset.y;
if (self.convDelegate && [self.convDelegate respondsToSelector:@selector(tableViewDidScroll:)]) {
[self.convDelegate tableViewDidScroll:offsetY];
}
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
[self updateTipsViewStatus];
return self.dataProvider.conversationList.count;
}
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
return YES;
}
- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
TUIConversationCellData *cellData = self.dataProvider.conversationList[indexPath.row];
NSMutableArray *rowActions = [NSMutableArray array];
[self parseActionHiddenTagAndCustomizedItems:cellData];
@weakify(self);
if (cellData.isLocalConversationFoldList) {
UITableViewRowAction *markHideAction =
[UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault
title:TIMCommonLocalizableString(MarkHide)
handler:^(UITableViewRowAction *_Nonnull action, NSIndexPath *_Nonnull indexPath) {
@strongify(self);
[self.dataProvider markConversationHide:cellData];
if (cellData.isLocalConversationFoldList) {
[TUIConversationListDataProvider cacheConversationFoldListSettings_HideFoldItem:YES];
}
}];
markHideAction.backgroundColor = RGB(242, 147, 64);
if (!self.hideHideAction) {
[rowActions addObject:markHideAction];
}
return rowActions;
}
// UITableViewRowAction *deleteAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive
// title:TIMCommonLocalizableString(Delete)
// handler:^(UITableViewRowAction *_Nonnull action, NSIndexPath *_Nonnull indexPath) {
// @strongify(self);
// TUISecondConfirmBtnInfo *cancelBtnInfo = [[TUISecondConfirmBtnInfo alloc] init];
// cancelBtnInfo.tile = TIMCommonLocalizableString(Cancel);
// cancelBtnInfo.click = ^{
// self.editing = NO;
// };
// TUISecondConfirmBtnInfo *confirmBtnInfo = [[TUISecondConfirmBtnInfo alloc] init];
// confirmBtnInfo.tile = TIMCommonLocalizableString(Delete);
// confirmBtnInfo.click = ^{
// [self.dataProvider removeConversation:cellData];
// self.editing = NO;
// };
// [TUISecondConfirm show:TIMCommonLocalizableString(TUIKitConversationTipsDelete)
// cancelBtnInfo:cancelBtnInfo
// confirmBtnInfo:confirmBtnInfo];
// }];
// deleteAction.backgroundColor = RGB(255, 88, 88);
// Delete action
UITableViewRowAction *deleteAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive
title:TIMCommonLocalizableString(Delete)
handler:^(UITableViewRowAction *_Nonnull action, NSIndexPath *_Nonnull indexPath) {
@strongify(self);
TUISecondConfirmBtnInfo *cancelBtnInfo = [[TUISecondConfirmBtnInfo alloc] init];
cancelBtnInfo.tile = TIMCommonLocalizableString(Cancel);
cancelBtnInfo.click = ^{
self.editing = NO;
};
TUISecondConfirmBtnInfo *confirmBtnInfo = [[TUISecondConfirmBtnInfo alloc] init];
confirmBtnInfo.tile = TIMCommonLocalizableString(Delete);
confirmBtnInfo.click = ^{
[self.dataProvider removeConversation:cellData];
self.editing = NO;
};
[TUISecondConfirm show:TIMCommonLocalizableString(TUIKitConversationTipsDelete)
cancelBtnInfo:cancelBtnInfo
confirmBtnInfo:confirmBtnInfo];
}];
deleteAction.backgroundColor = RGB(255, 88, 88);
if (!self.hideDeleteAction) {
[rowActions addObject:deleteAction];
}
NSString*topTitle = cellData.isOnTop?TIMCommonLocalizableString(CancelStickonTop):TIMCommonLocalizableString(StickyonTop);
UITableViewRowAction *onTopAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive
title:topTitle
handler:^(UITableViewRowAction *_Nonnull action, NSIndexPath *_Nonnull indexPath) {
@strongify(self);
TUIConversationPin *pin = [TUIConversationPin sharedInstance];
if (!cellData.isOnTop){
[pin addTopConversation:cellData.conversationID callback:^(BOOL success, NSString * _Nullable errorMessage) {
NSLog(@"置顶成功");
}];
}else{
[pin removeTopConversation:cellData.conversationID callback:^(BOOL success, NSString * _Nullable errorMessage) {
NSLog(@"取消置顶成功");
}];
}
}];
onTopAction.backgroundColor = RGB(54,101,249);
[rowActions addObject:onTopAction];
// MarkAsRead action
// UITableViewRowAction *markAsReadAction =
// [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault
// title:(cellData.isMarkAsUnread || cellData.unreadCount > 0) ? TIMCommonLocalizableString(MarkAsRead)
// : TIMCommonLocalizableString(MarkAsUnRead)
// handler:^(UITableViewRowAction *_Nonnull action, NSIndexPath *_Nonnull indexPath) {
// @strongify(self);
// if (cellData.isMarkAsUnread || cellData.unreadCount > 0) {
// [self.dataProvider markConversationAsRead:cellData];
// if (cellData.isLocalConversationFoldList) {
// [TUIConversationListDataProvider cacheConversationFoldListSettings_FoldItemIsUnread:NO];
// }
// } else {
// [self.dataProvider markConversationAsUnRead:cellData];
// if (cellData.isLocalConversationFoldList) {
// [TUIConversationListDataProvider cacheConversationFoldListSettings_FoldItemIsUnread:YES];
// }
// }
// }];
// markAsReadAction.backgroundColor = RGB(20, 122, 255);
// if (!self.hideMarkReadAction) {
// [rowActions addObject:markAsReadAction];
// }
//
// // More action
// NSArray *moreExtensionList =
// [TUICore getExtensionList:TUICore_TUIConversationExtension_ConversationCellMoreAction_ClassicExtensionID
// param:@{
// TUICore_TUIConversationExtension_ConversationCellAction_ConversationIDKey : cellData.conversationID,
// TUICore_TUIConversationExtension_ConversationCellAction_MarkListKey : cellData.conversationMarkList ?: @[],
// TUICore_TUIConversationExtension_ConversationCellAction_GroupListKey : cellData.conversationGroupList ?: @[]
// }];
// if (self.disableMoreActionExtension || 0 == moreExtensionList.count) {
// UITableViewRowAction *markAsHideAction =
// [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive
// title:TIMCommonLocalizableString(MarkHide)
// handler:^(UITableViewRowAction *_Nonnull action, NSIndexPath *_Nonnull indexPath) {
// @strongify(self);
// [self.dataProvider markConversationHide:cellData];
// if (cellData.isLocalConversationFoldList) {
// [TUIConversationListDataProvider cacheConversationFoldListSettings_HideFoldItem:YES];
// }
// }];
// markAsHideAction.backgroundColor = RGB(242, 147, 64);
// if (!self.hideHideAction) {
// [rowActions addObject:markAsHideAction];
// }
// } else {
// UITableViewRowAction *moreAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive
// title:TIMCommonLocalizableString(More)
// handler:^(UITableViewRowAction *_Nonnull action, NSIndexPath *_Nonnull indexPath) {
// @strongify(self);
// self.editing = NO;
// [self showMoreAction:cellData extensionList:moreExtensionList];
// }];
// moreAction.backgroundColor = RGB(242, 147, 64);
// [rowActions addObject:moreAction];
// }
return rowActions;
}
// available ios 11 +
- (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView
trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath API_AVAILABLE(ios(11.0)) {
TUIConversationCellData *cellData = self.dataProvider.conversationList[indexPath.row];
[self parseActionHiddenTagAndCustomizedItems:cellData];
// config Actions
@weakify(self);
if (cellData.isLocalConversationFoldList && !self.hideHideAction) {
UIContextualAction *markHideAction = [UIContextualAction
contextualActionWithStyle:UIContextualActionStyleNormal
title:TIMCommonLocalizableString(MarkHide)
handler:^(UIContextualAction *_Nonnull action, __kindof UIView *_Nonnull sourceView, void (^_Nonnull completionHandler)(BOOL)) {
@strongify(self);
[self.dataProvider markConversationHide:cellData];
if (cellData.isLocalConversationFoldList) {
[TUIConversationListDataProvider cacheConversationFoldListSettings_HideFoldItem:YES];
}
}];
markHideAction.backgroundColor = RGB(242, 147, 64);
UISwipeActionsConfiguration *configuration = [UISwipeActionsConfiguration configurationWithActions:@[ markHideAction ]];
configuration.performsFirstActionWithFullSwipe = NO;
return configuration;
}
NSMutableArray *arrayM = [NSMutableArray array];
// Delete action
UIContextualAction *deleteAction = [UIContextualAction
contextualActionWithStyle:UIContextualActionStyleNormal
title:TIMCommonLocalizableString(Delete)
handler:^(UIContextualAction *_Nonnull action, __kindof UIView *_Nonnull sourceView, void (^_Nonnull completionHandler)(BOOL)) {
@strongify(self);
TUISecondConfirmBtnInfo *cancelBtnInfo = [[TUISecondConfirmBtnInfo alloc] init];
cancelBtnInfo.tile = TIMCommonLocalizableString(Cancel);
cancelBtnInfo.click = ^{
self.editing = NO;
};
TUISecondConfirmBtnInfo *confirmBtnInfo = [[TUISecondConfirmBtnInfo alloc] init];
confirmBtnInfo.tile = TIMCommonLocalizableString(Delete);
confirmBtnInfo.click = ^{
[self.dataProvider removeConversation:cellData];
self.editing = NO;
};
[TUISecondConfirm show:TIMCommonLocalizableString(TUIKitConversationTipsDelete)
cancelBtnInfo:cancelBtnInfo
confirmBtnInfo:confirmBtnInfo];
}];
deleteAction.backgroundColor = RGB(242, 77, 76);
if (!self.hideDeleteAction) {
[arrayM addObject:deleteAction];
}
UIContextualAction *markAsReadAction = [UIContextualAction
contextualActionWithStyle:UIContextualActionStyleNormal
title:(cellData.isOnTop) ? TIMCommonLocalizableString(CancelStickonTop)
: TIMCommonLocalizableString(StickyonTop)
handler:^(UIContextualAction *_Nonnull action, __kindof UIView *_Nonnull sourceView, void (^_Nonnull completionHandler)(BOOL)) {
@strongify(self);
TUIConversationPin *pin = [TUIConversationPin sharedInstance];
if (!cellData.isOnTop){
[pin addTopConversation:cellData.conversationID callback:^(BOOL success, NSString * _Nullable errorMessage) {
NSLog(@"置顶成功");
}];
}else{
[pin removeTopConversation:cellData.conversationID callback:^(BOOL success, NSString * _Nullable errorMessage) {
NSLog(@"取消置顶成功");
}];
}
}];
markAsReadAction.backgroundColor = RGB(20, 122, 255);
[arrayM addObject:markAsReadAction];
// More action
// NSArray *moreExtensionList =
// [TUICore getExtensionList:TUICore_TUIConversationExtension_ConversationCellMoreAction_ClassicExtensionID
// param:@{
// TUICore_TUIConversationExtension_ConversationCellAction_ConversationIDKey : cellData.conversationID,
// TUICore_TUIConversationExtension_ConversationCellAction_MarkListKey : cellData.conversationMarkList ?: @[],
// TUICore_TUIConversationExtension_ConversationCellAction_GroupListKey : cellData.conversationGroupList ?: @[],
// }];
// if (self.disableMoreActionExtension || 0 == moreExtensionList.count) {
// UIContextualAction *markAsHideAction = [UIContextualAction
// contextualActionWithStyle:UIContextualActionStyleNormal
// title:TIMCommonLocalizableString(MarkHide)
// handler:^(UIContextualAction *_Nonnull action, __kindof UIView *_Nonnull sourceView, void (^_Nonnull completionHandler)(BOOL)) {
// @strongify(self);
// [self.dataProvider markConversationHide:cellData];
// if (cellData.isLocalConversationFoldList) {
// [TUIConversationListDataProvider cacheConversationFoldListSettings_HideFoldItem:YES];
// }
// }];
// markAsHideAction.backgroundColor = RGB(242, 147, 64);
// if (!self.hideHideAction) {
// [arrayM addObject:markAsHideAction];
// }
// } else {
// UIContextualAction *moreAction = [UIContextualAction
// contextualActionWithStyle:UIContextualActionStyleNormal
// title:TIMCommonLocalizableString(More)
// handler:^(UIContextualAction *_Nonnull action, __kindof UIView *_Nonnull sourceView, void (^_Nonnull completionHandler)(BOOL)) {
// @strongify(self);
// self.editing = NO;
// [self showMoreAction:cellData extensionList:moreExtensionList];
// }];
// moreAction.backgroundColor = RGB(242, 147, 64);
// [arrayM addObject:moreAction];
// }
UISwipeActionsConfiguration *configuration = [UISwipeActionsConfiguration configurationWithActions:[NSArray arrayWithArray:arrayM]];
configuration.performsFirstActionWithFullSwipe = NO;
return configuration;
}
// MARK: action
- (void)showMoreAction:(TUIConversationCellData *)cellData extensionList:(NSArray *)extensionList {
UIAlertController *ac = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
__weak typeof(self) weakSelf = self;
if (self.customizedItems.count > 0) {
for (UIAlertAction *action in self.customizedItems) {
[ac tuitheme_addAction:action];
}
}
if (!self.hideHideAction) {
[ac tuitheme_addAction:[UIAlertAction actionWithTitle:TIMCommonLocalizableString(MarkHide)
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *_Nonnull action) {
__strong typeof(weakSelf) strongSelf = weakSelf;
[strongSelf.dataProvider markConversationHide:cellData];
if (cellData.isLocalConversationFoldList) {
[TUIConversationListDataProvider cacheConversationFoldListSettings_HideFoldItem:YES];
}
}]];
}
[self addCustomAction:ac cellData:cellData];
[ac tuitheme_addAction:[UIAlertAction actionWithTitle:TIMCommonLocalizableString(Cancel) style:UIAlertActionStyleCancel handler:nil]];
if (self.convDelegate && [self.convDelegate respondsToSelector:@selector(tableViewDidShowAlert:)]) {
[self.convDelegate tableViewDidShowAlert:ac];
}
}
- (void)addCustomAction:(UIAlertController *)ac cellData:(TUIConversationCellData *)cellData {
NSArray *extensionList =
[TUICore getExtensionList:TUICore_TUIConversationExtension_ConversationCellMoreAction_ClassicExtensionID
param:@{
TUICore_TUIConversationExtension_ConversationCellAction_ConversationIDKey : cellData.conversationID,
TUICore_TUIConversationExtension_ConversationCellAction_MarkListKey : cellData.conversationMarkList ?: @[],
TUICore_TUIConversationExtension_ConversationCellAction_GroupListKey : cellData.conversationGroupList ?: @[]
}];
for (TUIExtensionInfo *info in extensionList) {
UIAlertAction *action = [UIAlertAction actionWithTitle:info.text
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *_Nonnull action) {
info.onClicked(@{});
}];
[ac tuitheme_addAction:action];
}
}
- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath {
return NO;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
TUIConversationCell *cell = [tableView dequeueReusableCellWithIdentifier:gConversationCell_ReuseId forIndexPath:indexPath];
if (cell && indexPath.row < self.dataProvider.conversationList.count) {
TUIConversationCellData *data = [self.dataProvider.conversationList objectAtIndex:indexPath.row];
[self tableViewFillCell:cell withData:data];
NSArray *extensionList =
[TUICore getExtensionList:TUICore_TUIConversationExtension_ConversationCellUpperRightCorner_ClassicExtensionID
param:@{
TUICore_TUIConversationExtension_ConversationCellUpperRightCorner_GroupListKey : data.conversationGroupList ?: @[],
TUICore_TUIConversationExtension_ConversationCellUpperRightCorner_MarkListKey : data.conversationMarkList ?: @[],
}];
if (extensionList.count > 0) {
TUIExtensionInfo *info = extensionList.firstObject;
if (info.text.length > 0) {
cell.timeLabel.text = info.text;
} else if (info.icon) {
NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init];
textAttachment.image = info.icon;
NSAttributedString *imageStr = [NSAttributedString attributedStringWithAttachment:textAttachment];
cell.timeLabel.attributedText = imageStr;
}
}
}
return cell;
}
- (void)tableViewFillCell:(TUIConversationCell *)cell withData:(TUIConversationCellData *)data {
[cell fillWithData:data];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
TUIConversationCellData *data = [self.dataProvider.conversationList objectAtIndex:indexPath.row];
[self tableViewDidSelectCell:data];
}
- (void)tableViewDidSelectCell:(TUIConversationCellData *)data {
if (self.convDelegate && [self.convDelegate respondsToSelector:@selector(tableViewDidSelectCell:)]) {
[self.convDelegate tableViewDidSelectCell:data];
}
}
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
// Turn on or off the length of the last line of dividers by controlling this switch
BOOL needLastLineFromZeroToMax = NO;
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsMake(0, 16, 0, 16)];
if (needLastLineFromZeroToMax && indexPath.row == (self.dataProvider.conversationList.count - 1)) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}
}
// Prevent the cell from inheriting the Table View's margin settings
if (needLastLineFromZeroToMax && [cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
[cell setPreservesSuperviewLayoutMargins:NO];
}
// Explictly set your cell's layout margins
if (needLastLineFromZeroToMax && [cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
@end