如何在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
相关产品推荐
相关产品推荐

