如何在UITextField为空时隐藏自定义自动补全autocompleteTableView
解决方案:文本框为空时隐藏自动补全TableView
我来帮你搞定这个需求,同时顺便修正你代码里的几个小问题,让功能更顺畅~
核心修改:根据文本框内容状态控制TableView显示/隐藏
你当前的代码在shouldChangeCharactersInRange里直接把TableView设为显示,这就导致文本框为空时它还会出现。我们需要先计算修改后的文本内容,再根据这个内容是否为空来决定是否隐藏TableView:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { // 计算修改后的文本内容 NSString *newText = [textField.text stringByReplacingCharactersInRange:range withString:string]; // 根据新文本是否为空,控制TableView的显示状态 autocompleteTableView.hidden = [newText isEmpty]; // 只有当新文本不为空时,才执行自动补全搜索 if (![newText isEmpty]) { [self searchAutocompleteEntriesWithSubstring:newText]; } return YES; }
顺便修正你代码里的其他小问题
修复
didSelectRowAtIndexPath的方法签名错误
你当前的方法少了一个冒号,导致点击事件完全不会触发,修改后应该是:- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSString *selectedText = autocompleteMArray[indexPath.row]; NSLog(@"Selected Cell %@", selectedText); // 可选:把选中的内容填充到文本框,然后隐藏TableView self.txtActivity.text = selectedText; autocompleteTableView.hidden = YES; }优化
autocompleteMArray的初始化逻辑
你现在每次调用searchAutocompleteEntriesWithSubstring都重新创建数组,没必要。可以提前在viewDidLoad里初始化一次,之后只需要清空数组就行:- (void)viewDidLoad { [super viewDidLoad]; self.txtActivity.delegate = self; // 提前初始化自动补全数组 autocompleteMArray = [[NSMutableArray alloc] init]; [self configureAutoComTableView]; // 这里还修正了方法名的拼写错误(cofigure → configure) } - (void)searchAutocompleteEntriesWithSubstring:(NSString *)substring { [autocompleteMArray removeAllObjects]; // 直接清空已有内容,不用重新创建数组 for(NSString *curString in sCategory) { // 可选:忽略大小写,提升用户体验 NSRange substringRange = [curString rangeOfString:substring options:NSCaseInsensitiveSearch]; if (substringRange.location != NSNotFound) { [autocompleteMArray addObject:curString]; } } NSLog(@"*******The autocompleteMArray : %@ ", autocompleteMArray); [autocompleteTableView reloadData]; }修正方法名拼写错误
把cofigureAutoComTableView改成configureAutoComTableView,虽然不影响功能,但符合代码规范。
额外建议
- 在你的ViewController头文件里,记得声明实现了
UITextFieldDelegate、UITableViewDelegate、UITableViewDataSource协议,比如:@interface YourViewController : UIViewController <UITextFieldDelegate, UITableViewDelegate, UITableViewDataSource> - 当用户点击TableView的单元格后,建议把选中的内容填充到文本框并隐藏TableView,这是自动补全的常规交互逻辑,我已经在上面的
didSelectRowAtIndexPath里加上了这段代码。
内容的提问来源于stack exchange,提问作者Hanz Cheah
相关产品推荐
相关产品推荐

