You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;
}

顺便修正你代码里的其他小问题

  1. 修复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;
    }
    
  2. 优化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];
    }
    
  3. 修正方法名拼写错误
    把cofigureAutoComTableView改成configureAutoComTableView,虽然不影响功能,但符合代码规范。

额外建议

  • 在你的ViewController头文件里,记得声明实现了UITextFieldDelegate、UITableViewDelegate、UITableViewDataSource协议,比如:
    @interface YourViewController : UIViewController <UITextFieldDelegate, UITableViewDelegate, UITableViewDataSource>
    
  • 当用户点击TableView的单元格后,建议把选中的内容填充到文本框并隐藏TableView,这是自动补全的常规交互逻辑,我已经在上面的didSelectRowAtIndexPath里加上了这段代码。

内容的提问来源于stack exchange,提问作者Hanz Cheah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:18:00