iOS 实现SearchBar搜索及关键词高亮教程

0 下载量 178 浏览量 更新于2024-08-30 收藏 187KB PDF 举报
本文档主要介绍了如何在iOS应用中实现`UISearchBar`搜索栏功能,并对搜索结果显示关键字高亮。开发者将使用JSON数据处理英雄联盟的英雄名单,然后在`UITableView`中展示搜索结果。 首先,为了实现搜索功能,我们需要从本地获取JSON数据。这可以通过读取存储在应用程序资源中的TXT文件完成,文件包含JSON格式的数据。以下是读取JSON数据的关键代码: ```swift // 获取文件路径 let path = Bundle.main.path(forResource: "heros", ofType: "txt") // 将文件内容转化为NSData let data = try? Data(contentsOf: URL(fileURLWithPath: path!)) // 解析JSON数据 if let jsonData = data, let result = try? JSONSerialization.jsonObject(with: jsonData, options: []) as? [[String: Any]] { // 处理解析后的数据 } ``` 解析后的数据通常是一个二维数组,每个元素是一个字典,代表一个英雄的信息。为了进行搜索,我们需要提取出与搜索相关的字段,例如英雄的昵称(`nick`)。可以创建一个数组来存储这些昵称: ```swift var arrOfSearchBoxes = [String]() for dict in result { arrOfSearchBoxes.append(dict["nick"] as? String ?? "") } ``` 接下来,为了显示搜索结果,我们将使用`UITableView`。同时,我们会采用`UISearchController`来处理搜索行为。`UISearchController`可以方便地在当前界面显示搜索结果,无需跳转到新的视图控制器: ```swift // 声明UISearchController属性 var searchController = UISearchController(searchResultsController: nil) // 初始化UISearchController searchController = UISearchController(searchResultsController: nil) searchController.searchResultsUpdater = self searchController.obscuresBackgroundDuringPresentation = false searchController.searchBar.placeholder = "搜索英雄" navigationItem.searchController = searchController definesPresentationContext = true ``` 为了使搜索结果能高亮显示关键字,我们需要遵循`UISearchResultsUpdating`协议,并实现`updateSearchResults(for:)`方法。在这个方法中,我们可以根据用户的输入过滤数组,并更新`UITableView`的内容: ```swift func updateSearchResults(for searchController: UISearchController) { guard let searchText = searchController.searchBar.text else { return } let filteredArray = arrOfSearchBoxes.filter { $0.contains(searchText) } // 更新UITableView的数据源并刷新表格 // ... } ``` 为了在`UITableView`中显示高亮的关键字,你需要自定义`UITableViewCell`的`awakeFromNib()`方法,设置其文本标签(`UILabel`)为富文本,然后在显示搜索结果时,使用`NSMutableAttributedString`来高亮匹配的部分: ```swift func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) let item = filteredArray[indexPath.row] let range = (item as NSString).range(of: searchText) let attributedString = NSMutableAttributedString(string: item) if range.location != NSNotFound { attributedString.addAttribute(.foregroundColor, value: UIColor.red, range: range) } cell.textLabel?.attributedText = attributedString return cell } ``` 以上就是实现`UISearchBar`搜索栏及关键字高亮的基本步骤。通过这个过程,用户可以在搜索框中输入关键字,系统会实时过滤数据并在`UITableView`中显示高亮的结果。注意,实际应用中可能需要添加更多细节,如错误处理、用户体验优化等。