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

iOS Swift 4:TableView内嵌SearchBar实现用户姓名搜索问题

我来帮你搞定这个TableView里的用户姓名搜索功能,按照你的需求,咱们一步步实现:

实现TableView内SearchBar的用户搜索功能

1. 先做好基础配置

首先,你的ViewController要同时遵循UISearchBarDelegate、UITableViewDataSource和UITableViewDelegate协议,然后把SearchBar的代理绑定到当前VC,初始化时让搜索数组同步全量用户列表:

class YourUserListVC: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate {
    // 你的现有变量
    var users = [User]()
    var currentUserArray = [User]()
    
    // 假设你已经通过IBOutlet关联了searchBar和tableView
    @IBOutlet weak var searchBar: UISearchBar!
    @IBOutlet weak var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 绑定代理
        searchBar.delegate = self
        tableView.dataSource = self
        tableView.delegate = self
        
        // 初始化搜索数组为全量用户
        currentUserArray = users
        tableView.reloadData()
    }
}

2. 核心搜索逻辑实现

接下来通过SearchBar的代理方法处理搜索文本变化和取消搜索的场景:

实时响应搜索输入

当用户在搜索栏输入文本时,实时过滤用户列表,这里做了大小写忽略的处理,避免因为大小写导致匹配不到:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    // 搜索文本为空(含纯空格)时,恢复显示全量用户
    guard !searchText.trimmingCharacters(in: .whitespaces).isEmpty else {
        currentUserArray = users
        tableView.reloadData()
        return
    }
    
    // 过滤用户列表,匹配姓名(处理name为nil的情况,防止崩溃)
    currentUserArray = users.filter { user in
        guard let userName = user.name else { return false }
        return userName.lowercased().contains(searchText.lowercased())
    }
    
    // 更新TableView展示结果
    tableView.reloadData()
}

取消搜索时恢复原状

当用户点击搜索栏的取消按钮时,清空文本、恢复全量列表并收起键盘:

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
    searchBar.text = ""
    currentUserArray = users
    tableView.reloadData()
    // 收起键盘,提升用户体验
    searchBar.resignFirstResponder()
}

3. 确保TableView用搜索数组提供数据

修改你的TableView数据源方法,让它使用currentUserArray来返回行数和配置cell:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return currentUserArray.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "UserCell", for: indexPath) as! UserTableViewCell
    let targetUser = currentUserArray[indexPath.row]
    
    // 配置cell的姓名标签,处理name为空的情况
    cell.userNameLabel.text = targetUser.name ?? "未设置姓名"
    // 其他信息比如头像、邮箱也可以在这里配置
    if let imageUrl = targetUser.profileImageUrl {
        // 这里可以用SDWebImage等库加载头像
        // cell.userAvatarImageView.sd_setImage(with: URL(string: imageUrl))
    }
    
    return cell
}

额外优化小建议

  • 空结果提示:如果搜索后currentUserArray为空,可以给TableView添加一个占位视图,提示用户“没有找到匹配的用户”,避免界面空白。
  • 大列表性能优化:如果你的用户列表非常大,建议把过滤操作放到后台线程执行,避免卡顿,比如:
    DispatchQueue.global().async {
        let filteredUsers = self.users.filter { ... }
        DispatchQueue.main.async {
            self.currentUserArray = filteredUsers
            self.tableView.reloadData()
        }
    }
    
  • 扩展匹配规则:如果需要支持更灵活的搜索(比如匹配拼音首字母、用户名/邮箱),可以扩展过滤条件,比如:
    return userName.lowercased().contains(searchText.lowercased()) || 
           (targetUser.login?.lowercased().contains(searchText.lowercased()) ?? false)
    

内容的提问来源于stack exchange,提问作者George Heints

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:02:17