Вам необходимо поддерживать две структуры данных; один - ваши фактические данные, а другой - источник данных для вашего табличного представления. Если поиск / запрос не предоставлен, вы передаете полный набор результатов источнику данных. Когда вводится запрос, вы фильтруете по полному набору данных, извлекаете совпадения и затем подаете это подмножество в свой источник данных.
Вы также можете реализовать протокол UISearchResultsUpdating
, который должен упростить задачу.
В моем случае я не поддерживаю два набора результатов, потому что я активно подключаюсь к сети для получения нового набора отдельных результатов. Но если вы уже загрузили свой набор данных один раз, то вы, вероятно, захотите использовать подход с двумя наборами результатов.
Вот пример кода:
import Foundation
import UIKit
class WinePickerViewController : UITableViewController, UISearchResultsUpdating {
// MARK: - Properties
var pickerDelegate: WinePickerDelegate?;
var searchResults = [Wine]();
let searchController = UISearchController(searchResultsController: nil);
var lastSearchTerm: String! = "";
var appDelegate : AppDelegate?;
// MARK: - View Setup
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchResultsUpdater = self
searchController.hidesNavigationBarDuringPresentation = false
searchController.dimsBackgroundDuringPresentation = false
searchController.searchBar.sizeToFit()
self.tableView.tableHeaderView = searchController.searchBar
tableView.tableHeaderView = searchController.searchBar;
definesPresentationContext = true
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated);
self.searchController.isActive = true
self.perform(#selector(showKeyboard), with:nil, afterDelay:0.1);
}
func showKeyboard() {
self.searchController.searchBar.becomeFirstResponder();
}
deinit {
searchController.view!.removeFromSuperview();
}
func performSearch() {
ServerInterface.shared.winesSearchByAutocomplete(self.lastSearchTerm) { error, response in
if error == nil {
if let result = response as [Wine]? {
self.searchResults = result;
}
self.tableView.reloadData();
}
};
}
func filterContentForSearchText(_ searchText: String, scope: String = "All") {
NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(performSearch), object: nil)
lastSearchTerm = searchText.lowercased();
self.perform(#selector(performSearch), with: nil, afterDelay: 0.5)
}
func updateSearchResults(for searchController: UISearchController) {
filterContentForSearchText(searchController.searchBar.text!)
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return searchResults.count;
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
let wine = searchResults[indexPath.row];
cell.textLabel?.text = wine.title();
cell.detailTextLabel?.text = wine.code;
cell.detailTextLabel?.textColor = UISettings.primaryTintColor
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let wine = searchResults[indexPath.row];
pickerDelegate?.didPickWine(wine);
}
}