This commit is contained in:
2026-01-28 20:18:18 +08:00
parent 70a8466d9f
commit ef52cd4872
7 changed files with 165 additions and 44 deletions

View File

@@ -16,6 +16,7 @@
#import "AiVM.h"
#import <MJExtension/MJExtension.h>
#import <Masonry/Masonry.h>
#import <MJRefresh/MJRefresh.h>
static NSString *const kCommentHeaderIdentifier = @"CommentHeader";
static NSString *const kReplyCellIdentifier = @"ReplyCell";
@@ -33,6 +34,12 @@ static NSString *const kCommentFooterIdentifier = @"CommentFooter";
@property(nonatomic, strong) NSMutableArray<KBAICommentModel *> *comments;
@property(nonatomic, assign) NSInteger totalCommentCount;
///
@property(nonatomic, assign) NSInteger currentPage;
@property(nonatomic, assign) NSInteger pageSize;
@property(nonatomic, assign) BOOL isLoading;
@property(nonatomic, assign) BOOL hasMoreData;
///
@property(nonatomic, assign) CGFloat keyboardHeight;
///
@@ -56,6 +63,9 @@ static NSString *const kCommentFooterIdentifier = @"CommentFooter";
self = [super initWithFrame:frame];
if (self) {
self.comments = [NSMutableArray array];
self.currentPage = 1;
self.pageSize = 20;
self.hasMoreData = YES;
[self setupUI];
[self setupKeyboardObservers];
}
@@ -114,6 +124,20 @@ static NSString *const kCommentFooterIdentifier = @"CommentFooter";
make.left.right.equalTo(self);
make.bottom.equalTo(self.inputView.mas_top);
}];
//
__weak typeof(self) weakSelf = self;
MJRefreshAutoNormalFooter *footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
__strong typeof(weakSelf) strongSelf = weakSelf;
if (!strongSelf) {
return;
}
[strongSelf loadMoreComments];
}];
footer.stateLabel.hidden = YES;
footer.backgroundColor = [UIColor clearColor];
footer.automaticallyHidden = YES;
self.tableView.mj_footer = footer;
}
#pragma mark - Keyboard Observers
@@ -174,49 +198,87 @@ static NSString *const kCommentFooterIdentifier = @"CommentFooter";
#pragma mark - Data Loading
- (void)loadComments {
if (self.isLoading) {
return;
}
self.currentPage = 1;
self.hasMoreData = YES;
[self.tableView.mj_footer resetNoMoreData];
[self fetchCommentsAtPage:self.currentPage append:NO];
}
- (void)loadMoreComments {
if (self.isLoading) {
[self.tableView.mj_footer endRefreshing];
return;
}
if (!self.hasMoreData) {
[self.tableView.mj_footer endRefreshingWithNoMoreData];
return;
}
NSInteger nextPage = self.currentPage + 1;
[self fetchCommentsAtPage:nextPage append:YES];
}
- (void)fetchCommentsAtPage:(NSInteger)page append:(BOOL)append {
if (self.companionId <= 0) {
NSLog(@"[KBAICommentView] companionId 未设置,无法加载评论");
[self showEmptyState];
[self.tableView.mj_footer endRefreshing];
return;
}
self.isLoading = YES;
__weak typeof(self) weakSelf = self;
[self.aiVM fetchCommentsWithCompanionId:self.companionId
pageNum:1
pageSize:20
pageNum:page
pageSize:self.pageSize
completion:^(KBCommentPageModel *pageModel, NSError *error) {
__strong typeof(weakSelf) strongSelf = weakSelf;
if (!strongSelf) {
return;
}
strongSelf.isLoading = NO;
if (error) {
NSLog(@"[KBAICommentView] 加载评论失败:%@", error.localizedDescription);
//
dispatch_async(dispatch_get_main_queue(), ^{
[strongSelf showEmptyStateWithError];
if (append) {
[strongSelf.tableView.mj_footer endRefreshing];
} else {
[strongSelf showEmptyStateWithError];
}
});
return;
}
dispatch_async(dispatch_get_main_queue(), ^{
[strongSelf updateCommentsWithPageModel:pageModel];
[strongSelf updateCommentsWithPageModel:pageModel append:append];
});
}];
}
/// KBCommentPageModel UI KBAICommentModel
- (void)updateCommentsWithPageModel:(KBCommentPageModel *)pageModel {
- (void)updateCommentsWithPageModel:(KBCommentPageModel *)pageModel append:(BOOL)append {
if (!pageModel) {
NSLog(@"[KBAICommentView] pageModel 为空");
//
[self showEmptyState];
[self.tableView.mj_footer endRefreshing];
return;
}
self.totalCommentCount = pageModel.total;
[self.comments removeAllObjects];
if (!append) {
[self.comments removeAllObjects];
}
// tableView
CGFloat tableWidth = self.tableView.bounds.size.width;
@@ -224,7 +286,7 @@ static NSString *const kCommentFooterIdentifier = @"CommentFooter";
tableWidth = [UIScreen mainScreen].bounds.size.width;
}
NSLog(@"[KBAICommentView] 加载到 %ld 条评论,共 %ld 条", (long)pageModel.records.count, (long)pageModel.total);
NSLog(@"[KBAICommentView] 加载到 %ld 条评论,共 %ld 条,页码:%ld/%ld", (long)pageModel.records.count, (long)pageModel.total, (long)pageModel.current, (long)pageModel.pages);
for (KBCommentItem *item in pageModel.records) {
// KBAICommentModel使 MJExtension
@@ -243,6 +305,20 @@ static NSString *const kCommentFooterIdentifier = @"CommentFooter";
[self updateTitle];
[self.tableView reloadData];
//
self.currentPage = pageModel.current > 0 ? pageModel.current : self.currentPage;
if (pageModel.pages > 0) {
self.hasMoreData = pageModel.current < pageModel.pages;
} else {
self.hasMoreData = pageModel.records.count >= self.pageSize;
}
if (self.hasMoreData) {
[self.tableView.mj_footer endRefreshing];
} else {
[self.tableView.mj_footer endRefreshingWithNoMoreData];
}
//
if (self.comments.count == 0) {
@@ -641,6 +717,7 @@ static NSInteger const kRepliesLoadCount = 5;
_tableView.backgroundColor = [UIColor clearColor];
_tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
_tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
_tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 0.01)];
// "暂无数据"
_tableView.useEmptyDataSet = NO;