diff --git a/keyBoard/Class/AiTalk/V/PopView/KBAIPersonaSidebarView.m b/keyBoard/Class/AiTalk/V/PopView/KBAIPersonaSidebarView.m index d94ad75..0c5d8e6 100644 --- a/keyBoard/Class/AiTalk/V/PopView/KBAIPersonaSidebarView.m +++ b/keyBoard/Class/AiTalk/V/PopView/KBAIPersonaSidebarView.m @@ -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 *personas; @property (nonatomic, strong) NSArray *displayPersonas; +@property (nonatomic, strong) NSArray *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,31 +320,67 @@ #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 { - NSMutableArray *result = [NSMutableArray array]; - for (KBPersonaModel *persona in self.personas) { - NSString *name = persona.name ?: @""; - NSString *desc = persona.shortDesc ?: persona.introText ?: @""; - if ([name localizedCaseInsensitiveContainsString:keyword] || - [desc localizedCaseInsensitiveContainsString:keyword]) { - [result addObject:persona]; - } - } - self.displayPersonas = result; - } + self.displayPersonas = self.personas; [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 ?: @""; + NSString *desc = persona.shortDesc ?: persona.introText ?: @""; + if ([name localizedCaseInsensitiveContainsString:keyword] || + [desc localizedCaseInsensitiveContainsString:keyword]) { + [result addObject:persona]; + } + } + self.searchResults = result; + NSLog(@"[SidebarSearch] 搜索结果: %ld 条", (long)self.searchResults.count); + if (self.searchResults.count > 0) { + [self showSearchResults]; + [self.searchResultTableView reloadData]; + } else { + [self hideSearchResults]; + } +} + +- (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