tableview倒置
This commit is contained in:
@@ -260,7 +260,7 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
|
||||
__weak typeof(self) weakSelf = self;
|
||||
[self.aiVM fetchChatHistoryWithCompanionId:companionId
|
||||
pageNum:self.currentPage
|
||||
pageSize:20
|
||||
pageSize:10
|
||||
completion:^(KBChatHistoryPageModel *pageModel, NSError *error) {
|
||||
__strong typeof(weakSelf) strongSelf = weakSelf;
|
||||
if (!strongSelf) {
|
||||
@@ -304,8 +304,8 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
|
||||
|
||||
message.isComplete = YES;
|
||||
message.needsTypewriterEffect = NO;
|
||||
// [newMessages addObject:message];
|
||||
[newMessages insertObject:message atIndex:0];
|
||||
[newMessages addObject:message];
|
||||
// [newMessages insertObject:message atIndex:0];
|
||||
}
|
||||
|
||||
// 插入历史消息(确保开场白始终是第一条)
|
||||
@@ -317,12 +317,19 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
|
||||
strongSelf.messages = newMessages;
|
||||
[strongSelf ensureOpeningMessageAtTop];
|
||||
} else {
|
||||
// 后续页,插入到开场白之后
|
||||
// 后续页,继续加载历史
|
||||
[strongSelf ensureOpeningMessageAtTop];
|
||||
if (newMessages.count > 0) {
|
||||
NSUInteger insertIndex = [strongSelf hasOpeningMessageAtTop] ? 1 : 0;
|
||||
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(insertIndex, newMessages.count)];
|
||||
[strongSelf.messages insertObjects:newMessages atIndexes:indexSet];
|
||||
if (strongSelf.chatView.inverted) {
|
||||
NSInteger openingIndex = [strongSelf openingMessageIndexInMessages];
|
||||
NSUInteger insertIndex = (openingIndex != NSNotFound) ? (NSUInteger)openingIndex : strongSelf.messages.count;
|
||||
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(insertIndex, newMessages.count)];
|
||||
[strongSelf.messages insertObjects:newMessages atIndexes:indexSet];
|
||||
} else {
|
||||
NSUInteger insertIndex = [strongSelf hasOpeningMessageAtTop] ? 1 : 0;
|
||||
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(insertIndex, newMessages.count)];
|
||||
[strongSelf.messages insertObjects:newMessages atIndexes:indexSet];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -335,10 +342,16 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
|
||||
keepOffset:NO
|
||||
scrollToBottom:YES];
|
||||
} else {
|
||||
NSLog(@"[KBPersonaChatCell] 刷新 UI - loadedPage: %ld, prependHistory",
|
||||
(long)loadedPage);
|
||||
KBAiChatMessage *openingMessage = [strongSelf hasOpeningMessageAtTop] ? strongSelf.messages.firstObject : nil;
|
||||
[strongSelf.chatView prependHistoryMessages:newMessages openingMessage:openingMessage];
|
||||
if (strongSelf.chatView.inverted) {
|
||||
NSLog(@"[KBPersonaChatCell] 刷新 UI - loadedPage: %ld, appendHistory", (long)loadedPage);
|
||||
KBAiChatMessage *openingMessage = [strongSelf openingMessageInMessages];
|
||||
[strongSelf.chatView appendHistoryMessages:newMessages openingMessage:openingMessage];
|
||||
} else {
|
||||
NSLog(@"[KBPersonaChatCell] 刷新 UI - loadedPage: %ld, prependHistory",
|
||||
(long)loadedPage);
|
||||
KBAiChatMessage *openingMessage = [strongSelf hasOpeningMessageAtTop] ? strongSelf.messages.firstObject : nil;
|
||||
[strongSelf.chatView prependHistoryMessages:newMessages openingMessage:openingMessage];
|
||||
}
|
||||
}
|
||||
[strongSelf.chatView endLoadMoreWithHasMoreData:strongSelf.hasMoreHistory];
|
||||
|
||||
@@ -381,6 +394,9 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
|
||||
if (self.messages.count == 0) {
|
||||
return NO;
|
||||
}
|
||||
if (self.chatView.inverted) {
|
||||
return [self isOpeningMessage:self.messages.lastObject];
|
||||
}
|
||||
return [self isOpeningMessage:self.messages.firstObject];
|
||||
}
|
||||
|
||||
@@ -409,7 +425,35 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
|
||||
KBAiChatMessage *openingMsg = [KBAiChatMessage assistantMessageWithText:introText];
|
||||
openingMsg.isComplete = YES;
|
||||
openingMsg.needsTypewriterEffect = NO;
|
||||
[self.messages insertObject:openingMsg atIndex:0];
|
||||
if (self.chatView.inverted) {
|
||||
[self.messages addObject:openingMsg];
|
||||
} else {
|
||||
[self.messages insertObject:openingMsg atIndex:0];
|
||||
}
|
||||
}
|
||||
|
||||
- (nullable KBAiChatMessage *)openingMessageInMessages {
|
||||
NSInteger index = [self openingMessageIndexInMessages];
|
||||
if (index == NSNotFound) {
|
||||
return nil;
|
||||
}
|
||||
return self.messages[index];
|
||||
}
|
||||
|
||||
- (NSInteger)openingMessageIndexInMessages {
|
||||
NSString *introText = self.persona.introText ?: @"";
|
||||
if (introText.length == 0 || self.messages.count == 0) {
|
||||
return NSNotFound;
|
||||
}
|
||||
|
||||
if (self.chatView.inverted) {
|
||||
NSInteger lastIndex = self.messages.count - 1;
|
||||
KBAiChatMessage *msg = self.messages[lastIndex];
|
||||
return [self isOpeningMessage:msg] ? lastIndex : NSNotFound;
|
||||
}
|
||||
|
||||
KBAiChatMessage *first = self.messages.firstObject;
|
||||
return [self isOpeningMessage:first] ? 0 : NSNotFound;
|
||||
}
|
||||
|
||||
#pragma mark - 通知处理
|
||||
@@ -454,7 +498,11 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
|
||||
|
||||
[self ensureOpeningMessageAtTop];
|
||||
KBAiChatMessage *message = [KBAiChatMessage userMessageWithText:text];
|
||||
[self.messages addObject:message];
|
||||
if (self.chatView.inverted) {
|
||||
[self.messages insertObject:message atIndex:0];
|
||||
} else {
|
||||
[self.messages addObject:message];
|
||||
}
|
||||
[self.chatView addMessage:message autoScroll:YES];
|
||||
}
|
||||
|
||||
@@ -465,7 +513,11 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
|
||||
|
||||
[self ensureOpeningMessageAtTop];
|
||||
KBAiChatMessage *message = [KBAiChatMessage loadingUserMessage];
|
||||
[self.messages addObject:message];
|
||||
if (self.chatView.inverted) {
|
||||
[self.messages insertObject:message atIndex:0];
|
||||
} else {
|
||||
[self.messages addObject:message];
|
||||
}
|
||||
[self.chatView addMessage:message autoScroll:YES];
|
||||
}
|
||||
|
||||
@@ -473,13 +525,25 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
|
||||
[self.chatView updateLastUserMessage:text];
|
||||
|
||||
// 更新数据源中的消息
|
||||
for (NSInteger i = self.messages.count - 1; i >= 0; i--) {
|
||||
KBAiChatMessage *message = self.messages[i];
|
||||
if (message.type == KBAiChatMessageTypeUser && message.isLoading) {
|
||||
message.text = text;
|
||||
message.isLoading = NO;
|
||||
message.isComplete = YES;
|
||||
break;
|
||||
if (self.chatView.inverted) {
|
||||
for (NSInteger i = 0; i < self.messages.count; i++) {
|
||||
KBAiChatMessage *message = self.messages[i];
|
||||
if (message.type == KBAiChatMessageTypeUser && message.isLoading) {
|
||||
message.text = text;
|
||||
message.isLoading = NO;
|
||||
message.isComplete = YES;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (NSInteger i = self.messages.count - 1; i >= 0; i--) {
|
||||
KBAiChatMessage *message = self.messages[i];
|
||||
if (message.type == KBAiChatMessageTypeUser && message.isLoading) {
|
||||
message.text = text;
|
||||
message.isLoading = NO;
|
||||
message.isComplete = YES;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -488,11 +552,21 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
|
||||
[self.chatView markLastUserMessageLoadingComplete];
|
||||
|
||||
// 同步更新数据源
|
||||
for (NSInteger i = self.messages.count - 1; i >= 0; i--) {
|
||||
KBAiChatMessage *message = self.messages[i];
|
||||
if (message.type == KBAiChatMessageTypeUser && message.isLoading) {
|
||||
message.isLoading = NO;
|
||||
break;
|
||||
if (self.chatView.inverted) {
|
||||
for (NSInteger i = 0; i < self.messages.count; i++) {
|
||||
KBAiChatMessage *message = self.messages[i];
|
||||
if (message.type == KBAiChatMessageTypeUser && message.isLoading) {
|
||||
message.isLoading = NO;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (NSInteger i = self.messages.count - 1; i >= 0; i--) {
|
||||
KBAiChatMessage *message = self.messages[i];
|
||||
if (message.type == KBAiChatMessageTypeUser && message.isLoading) {
|
||||
message.isLoading = NO;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -515,7 +589,11 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
|
||||
KBAiChatMessage *message = [KBAiChatMessage assistantMessageWithText:text
|
||||
audioId:audioId];
|
||||
message.needsTypewriterEffect = YES;
|
||||
[self.messages addObject:message];
|
||||
if (self.chatView.inverted) {
|
||||
[self.messages insertObject:message atIndex:0];
|
||||
} else {
|
||||
[self.messages addObject:message];
|
||||
}
|
||||
[self.chatView addMessage:message autoScroll:YES];
|
||||
}
|
||||
|
||||
@@ -527,18 +605,32 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
|
||||
|
||||
[self ensureOpeningMessageAtTop];
|
||||
KBAiChatMessage *message = [KBAiChatMessage loadingAssistantMessage];
|
||||
[self.messages addObject:message];
|
||||
if (self.chatView.inverted) {
|
||||
[self.messages insertObject:message atIndex:0];
|
||||
} else {
|
||||
[self.messages addObject:message];
|
||||
}
|
||||
[self.chatView addMessage:message autoScroll:YES];
|
||||
}
|
||||
|
||||
/// 移除 loading AI 消息
|
||||
- (void)removeLoadingAssistantMessage {
|
||||
// 从数据源中移除
|
||||
for (NSInteger i = self.messages.count - 1; i >= 0; i--) {
|
||||
KBAiChatMessage *message = self.messages[i];
|
||||
if (message.type == KBAiChatMessageTypeAssistant && message.isLoading) {
|
||||
[self.messages removeObjectAtIndex:i];
|
||||
break;
|
||||
if (self.chatView.inverted) {
|
||||
for (NSInteger i = 0; i < self.messages.count; i++) {
|
||||
KBAiChatMessage *message = self.messages[i];
|
||||
if (message.type == KBAiChatMessageTypeAssistant && message.isLoading) {
|
||||
[self.messages removeObjectAtIndex:i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (NSInteger i = self.messages.count - 1; i >= 0; i--) {
|
||||
KBAiChatMessage *message = self.messages[i];
|
||||
if (message.type == KBAiChatMessageTypeAssistant && message.isLoading) {
|
||||
[self.messages removeObjectAtIndex:i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -556,7 +648,22 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
|
||||
scrollView:(UIScrollView *)scrollView {
|
||||
CGFloat offsetY = scrollView.contentOffset.y;
|
||||
|
||||
// 下拉到顶部,加载历史消息
|
||||
if (chatView.inverted) {
|
||||
CGFloat contentHeight = scrollView.contentSize.height;
|
||||
CGFloat scrollViewHeight = scrollView.bounds.size.height;
|
||||
CGFloat maxOffsetY = contentHeight - scrollViewHeight + scrollView.contentInset.bottom;
|
||||
if (maxOffsetY < 0) {
|
||||
maxOffsetY = 0;
|
||||
}
|
||||
if (offsetY >= maxOffsetY - 50 && !self.isLoading && self.canTriggerLoadMore && self.hasMoreHistory) {
|
||||
self.canTriggerLoadMore = NO;
|
||||
[self loadMoreHistory];
|
||||
} else if (offsetY < maxOffsetY - 100) {
|
||||
self.canTriggerLoadMore = YES;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (offsetY <= 50 && !self.isLoading && self.canTriggerLoadMore && self.hasMoreHistory) {
|
||||
self.canTriggerLoadMore = NO;
|
||||
[self loadMoreHistory];
|
||||
@@ -622,6 +729,7 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
|
||||
if (!_chatView) {
|
||||
_chatView = [[KBChatTableView alloc] init];
|
||||
_chatView.backgroundColor = [UIColor clearColor];
|
||||
_chatView.inverted = YES;
|
||||
_chatView.delegate = self;
|
||||
}
|
||||
return _chatView;
|
||||
|
||||
Reference in New Issue
Block a user