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

如何在TableView顶部添加可运行的搜索栏(无需重构数组)

解决方案

无需重构现有数组,只需添加搜索控制器及过滤结果数组即可实现搜索功能,以下是完整修改方案:

1. 添加搜索相关属性

在类中添加搜索控制器、过滤后的院校名称/地址数组,并遵循UISearchResultsUpdating协议:

import UIKit

class MasterViewController: UITableViewController, UISearchResultsUpdating {
        
    var detailViewController: DetailViewController? = nil
    var objects = [Any]()
    
    // 原始数据数组
    var UniName: [String] = ["The University of Texas at Austin", "Rice University", "Texas A&M University", "Baylor university", "The University of Texas at El Paso", "southern methodist university", "The University of Texas at Dallas", "Texas Tech University", "University of North Texas", "Texas A&M University-Commerce"]
    var UniAddress: [String] = ["110 Inner Campus Drive Austin, TX 78705", "6100 Main St., Houston, TX 77005-1892", "Administration Building, 400 Bizzell St, College Station, TX 77843", "1311 S 5th St, Waco, TX 76706", "500 W University Ave, El Paso, TX 79968", "6425 Boaz Lane, Dallas, TX 75205", "800 W Campbell Rd, Richardson, TX 75080", "2500 Broadway, Lubbock, TX 79409", "1155 Union Cir, Denton, TX 76203", "2200 Campbell St, Commerce, TX 75428"]
    
    // 搜索相关属性
    let searchController = UISearchController(searchResultsController: nil)
    var filteredUniName: [String] = []
    var filteredUniAddress: [String] = []
    
    // 判断是否处于搜索状态
    var isSearching: Bool {
        return searchController.isActive && !searchController.searchBar.text!.isEmpty
    }
    
    // ... 原有代码
}

2. 配置搜索控制器

在viewDidLoad中添加搜索栏配置逻辑:

override func viewDidLoad() {
    super.viewDidLoad()
    
    // 配置搜索控制器
    searchController.searchResultsUpdater = self
    searchController.obscuresBackgroundDuringPresentation = false
    searchController.searchBar.placeholder = "搜索院校名称"
    navigationItem.searchController = searchController
    definesPresentationContext = true
    
    // 原有代码
    navigationItem.leftBarButtonItem = editButtonItem
    if let split = splitViewController {
        let controllers = split.viewControllers
        detailViewController = (controllers[controllers.count-1] as! UINavigationController).topViewController as? DetailViewController
    }
}

3. 实现搜索结果过滤逻辑

添加updateSearchResults(for:)方法,根据搜索文本同步过滤两个数组:

func updateSearchResults(for searchController: UISearchController) {
    guard let searchText = searchController.searchBar.text?.lowercased() else { return }
    
    // 清空历史过滤结果
    filteredUniName.removeAll()
    filteredUniAddress.removeAll()
    
    // 遍历原始数组,匹配搜索文本
    for (index, name) in UniName.enumerated() {
        if name.lowercased().contains(searchText) {
            filteredUniName.append(name)
            filteredUniAddress.append(UniAddress[index])
        }
    }
    
    // 刷新表格
    tableView.reloadData()
}

4. 修改TableView数据源方法

让表格根据搜索状态切换使用原始数组或过滤数组:

// MARK: - Table View
override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return isSearching ? filteredUniName.count : UniName.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
    cell.textLabel!.text = isSearching ? filteredUniName[indexPath.row] : UniName[indexPath.row]
    return cell
}

5. 修改Segue跳转逻辑

确保跳转时获取对应状态下的院校名称和地址:

// MARK: - Segues
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showDetail" {
        if let indexPath = tableView.indexPathForSelectedRow {
            let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController
            
            let selectedName = isSearching ? filteredUniName[indexPath.row] : UniName[indexPath.row]
            let selectedAddress = isSearching ? filteredUniAddress[indexPath.row] : UniAddress[indexPath.row]
            
            controller.setNewAddress(Member: selectedName, formap: selectedAddress)
            controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem
            controller.navigationItem.leftItemsSupplementBackButton = true
        }
    }
}

完整修改后代码

import UIKit

class MasterViewController: UITableViewController, UISearchResultsUpdating {
        
    var detailViewController: DetailViewController? = nil
    var objects = [Any]()
    
    var UniName: [String] = ["The University of Texas at Austin", "Rice University", "Texas A&M University", "Baylor university", "The University of Texas at El Paso", "southern methodist university", "The University of Texas at Dallas", "Texas Tech University", "University of North Texas", "Texas A&M University-Commerce"]
    var UniAddress: [String] = ["110 Inner Campus Drive Austin, TX 78705", "6100 Main St., Houston, TX 77005-1892", "Administration Building, 400 Bizzell St, College Station, TX 77843", "1311 S 5th St, Waco, TX 76706", "500 W University Ave, El Paso, TX 79968", "6425 Boaz Lane, Dallas, TX 75205", "800 W Campbell Rd, Richardson, TX 75080", "2500 Broadway, Lubbock, TX 79409", "1155 Union Cir, Denton, TX 76203", "2200 Campbell St, Commerce, TX 75428"]
    
    // 搜索相关属性
    let searchController = UISearchController(searchResultsController: nil)
    var filteredUniName: [String] = []
    var filteredUniAddress: [String] = []
    
    var isSearching: Bool {
        return searchController.isActive && !searchController.searchBar.text!.isEmpty
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 配置搜索控制器
        searchController.searchResultsUpdater = self
        searchController.obscuresBackgroundDuringPresentation = false
        searchController.searchBar.placeholder = "搜索院校名称"
        navigationItem.searchController = searchController
        definesPresentationContext = true
        
        navigationItem.leftBarButtonItem = editButtonItem
        if let split = splitViewController {
            let controllers = split.viewControllers
            detailViewController = (controllers[controllers.count-1] as! UINavigationController).topViewController as? DetailViewController
        }
    }
    
    override func viewWillAppear(_ animated: Bool) {
        clearsSelectionOnViewWillAppear = splitViewController!.isCollapsed
        super.viewWillAppear(animated)
    }
    
    // MARK: - Segues
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "showDetail" {
            if let indexPath = tableView.indexPathForSelectedRow {
                let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController
                
                let selectedName = isSearching ? filteredUniName[indexPath.row] : UniName[indexPath.row]
                let selectedAddress = isSearching ? filteredUniAddress[indexPath.row] : UniAddress[indexPath.row]
                
                controller.setNewAddress(Member: selectedName, formap: selectedAddress)
                controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem
                controller.navigationItem.leftItemsSupplementBackButton = true
            }
        }
    }
    
    // MARK: - Table View
    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return isSearching ? filteredUniName.count : UniName.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.textLabel!.text = isSearching ? filteredUniName[indexPath.row] : UniName[indexPath.row]
        return cell
    }
    
    // MARK: - Search Results Updating
    func updateSearchResults(for searchController: UISearchController) {
        guard let searchText = searchController.searchBar.text?.lowercased() else { return }
        
        filteredUniName.removeAll()
        filteredUniAddress.removeAll()
        
        for (index, name) in UniName.enumerated() {
            if name.lowercased().contains(searchText) {
                filteredUniName.append(name)
                filteredUniAddress.append(UniAddress[index])
            }
        }
        
        tableView.reloadData()
    }
}

内容的提问来源于stack exchange,提问作者Cody Shaffer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:05:41