处理搜索bug

This commit is contained in:
2026-02-03 18:03:21 +08:00
parent 0bd0392191
commit 822a814f85

View File

@@ -74,7 +74,9 @@
[self.arrowImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self.contentView);
make.right.equalTo(self.contentView).offset(-18);
make.width.height.mas_equalTo(16);
make.width.mas_equalTo(6);
make.height.mas_equalTo(8);
}];
[self.lineView mas_makeConstraints:^(MASConstraintMaker *make) {
@@ -165,9 +167,13 @@
@property (nonatomic, strong) UIImageView *searchIconView;
@property (nonatomic, strong) UITextField *searchField;
@property (nonatomic, strong) BaseTableView *tableView;
@property (nonatomic, strong) UIView *searchResultContainer;
@property (nonatomic, strong) BaseTableView *searchResultTableView;
@property (nonatomic, strong) NSArray<KBPersonaModel *> *personas;
@property (nonatomic, strong) NSArray<KBPersonaModel *> *displayPersonas;
@property (nonatomic, strong) NSArray<KBPersonaModel *> *searchResults;
@property (nonatomic, assign) BOOL isShowingSearchResults;
@property (nonatomic, assign) NSInteger currentPage;
@property (nonatomic, assign) BOOL hasMore;
@@ -193,6 +199,8 @@
[self.searchContainer addSubview:self.searchIconView];
[self.searchContainer addSubview:self.searchField];
[self.contentView addSubview:self.tableView];
[self.contentView addSubview:self.searchResultContainer];
[self.searchResultContainer addSubview:self.searchResultTableView];
[self.blurView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self);
@@ -227,6 +235,15 @@
make.left.right.bottom.equalTo(self.contentView);
}];
[self.searchResultContainer mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.searchContainer.mas_bottom).offset(10);
make.left.right.bottom.equalTo(self.contentView);
}];
[self.searchResultTableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.searchResultContainer);
}];
__weak typeof(self) weakSelf = self;
MJRefreshAutoNormalFooter *footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
__strong typeof(weakSelf) strongSelf = weakSelf;
@@ -254,6 +271,7 @@
if (self.personas.count == 0) {
self.currentPage = 1;
self.hasMore = YES;
NSLog(@"[SidebarSearch] 请求人设数据: page=%ld", (long)self.currentPage);
if ([self.delegate respondsToSelector:@selector(personaSidebarView:requestPersonasAtPage:)]) {
[self.delegate personaSidebarView:self requestPersonasAtPage:self.currentPage];
}
@@ -271,7 +289,12 @@
// HomeVC
self.personas = personas ?: @[];
self.currentPage = safePage;
NSLog(@"[SidebarSearch] 更新人设: count=%ld, page=%ld, hasMore=%@",
(long)self.personas.count, (long)self.currentPage, self.hasMore ? @"YES" : @"NO");
[self applyFilterAndReload];
if (self.isShowingSearchResults && self.searchField.text.length > 0) {
[self performSearch];
}
[self endLoadingMore];
}
@@ -297,14 +320,26 @@
#pragma mark - Search
- (void)searchFieldChanged:(UITextField *)textField {
[self applyFilterAndReload];
NSString *keyword = [textField.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSLog(@"[SidebarSearch] 输入变化: \"%@\"", keyword);
if (keyword.length == 0) {
[self hideSearchResults];
}
}
- (void)applyFilterAndReload {
NSString *keyword = [self.searchField.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if (keyword.length == 0) {
self.displayPersonas = self.personas;
} else {
[self.tableView reloadData];
}
- (void)performSearch {
NSString *keyword = [self.searchField.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSLog(@"[SidebarSearch] 执行搜索: \"%@\" (total=%ld)", keyword, (long)self.personas.count);
if (keyword.length == 0) {
[self hideSearchResults];
return;
}
NSMutableArray *result = [NSMutableArray array];
for (KBPersonaModel *persona in self.personas) {
NSString *name = persona.name ?: @"";
@@ -314,14 +349,38 @@
[result addObject:persona];
}
}
self.displayPersonas = result;
self.searchResults = result;
NSLog(@"[SidebarSearch] 搜索结果: %ld 条", (long)self.searchResults.count);
if (self.searchResults.count > 0) {
[self showSearchResults];
[self.searchResultTableView reloadData];
} else {
[self hideSearchResults];
}
[self.tableView reloadData];
}
- (void)showSearchResults {
self.isShowingSearchResults = YES;
self.tableView.hidden = YES;
self.searchResultContainer.hidden = NO;
[self.contentView bringSubviewToFront:self.searchResultContainer];
NSLog(@"[SidebarSearch] 显示搜索结果视图");
}
- (void)hideSearchResults {
self.isShowingSearchResults = NO;
self.searchResults = @[];
self.searchResultContainer.hidden = YES;
self.tableView.hidden = NO;
NSLog(@"[SidebarSearch] 隐藏搜索结果视图");
}
#pragma mark - UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (tableView == self.searchResultTableView) {
return self.searchResults.count;
}
return self.displayPersonas.count;
}
@@ -329,7 +388,9 @@
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
KBAIPersonaSidebarCell *cell = [tableView dequeueReusableCellWithIdentifier:@"KBAIPersonaSidebarCell"
forIndexPath:indexPath];
KBPersonaModel *persona = self.displayPersonas[indexPath.row];
KBPersonaModel *persona = (tableView == self.searchResultTableView)
? self.searchResults[indexPath.row]
: self.displayPersonas[indexPath.row];
BOOL selected = (persona.personaId == self.selectedPersonaId);
[cell configureWithPersona:persona selected:selected];
return cell;
@@ -342,12 +403,16 @@
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row >= self.displayPersonas.count) {
NSArray *source = (tableView == self.searchResultTableView) ? self.searchResults : self.displayPersonas;
if (indexPath.row >= source.count) {
return;
}
KBPersonaModel *persona = self.displayPersonas[indexPath.row];
KBPersonaModel *persona = source[indexPath.row];
self.selectedPersonaId = persona.personaId;
[self.tableView reloadData];
if (self.isShowingSearchResults) {
[self.searchResultTableView reloadData];
}
if ([self.delegate respondsToSelector:@selector(personaSidebarView:didSelectPersona:)]) {
[self.delegate personaSidebarView:self didSelectPersona:persona];
}
@@ -397,7 +462,9 @@
_searchField.font = [UIFont systemFontOfSize:14];
_searchField.clearButtonMode = UITextFieldViewModeWhileEditing;
_searchField.returnKeyType = UIReturnKeySearch;
_searchField.delegate = self;
[_searchField addTarget:self action:@selector(searchFieldChanged:) forControlEvents:UIControlEventEditingChanged];
[_searchField addTarget:self action:@selector(searchFieldReturnTapped:) forControlEvents:UIControlEventEditingDidEndOnExit];
}
return _searchField;
}
@@ -415,4 +482,46 @@
return _tableView;
}
- (UIView *)searchResultContainer {
if (!_searchResultContainer) {
_searchResultContainer = [[UIView alloc] init];
_searchResultContainer.backgroundColor = [UIColor clearColor];
_searchResultContainer.hidden = YES;
}
return _searchResultContainer;
}
- (BaseTableView *)searchResultTableView {
if (!_searchResultTableView) {
_searchResultTableView = [[BaseTableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
_searchResultTableView.backgroundColor = [UIColor clearColor];
_searchResultTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
_searchResultTableView.showsVerticalScrollIndicator = NO;
_searchResultTableView.delegate = self;
_searchResultTableView.dataSource = self;
[_searchResultTableView registerClass:[KBAIPersonaSidebarCell class] forCellReuseIdentifier:@"KBAIPersonaSidebarCell"];
}
return _searchResultTableView;
}
#pragma mark - UITextFieldDelegate
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
if (textField == self.searchField) {
NSLog(@"[SidebarSearch] textFieldShouldReturn");
[textField resignFirstResponder];
[self performSearch];
return YES;
}
return NO;
}
- (void)searchFieldReturnTapped:(UITextField *)textField {
if (textField == self.searchField) {
NSLog(@"[SidebarSearch] EditingDidEndOnExit");
[textField resignFirstResponder];
[self performSearch];
}
}
@end