Как настроить панель поиска для работы с моим представлением таблицы? - PullRequest
0 голосов
/ 22 января 2019

Я хочу иметь возможность поиска в моем табличном представлении, используя панель поиска.

Загрузка данных в просмотр таблицы работает нормально. Я не знаю, как завершить работу функции searchBar для поиска по имени.

override func tableView(_ tableView: UITableView, cellForRowAt       indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "ContactCell", for: indexPath)
    var dic:Dictionary<String,String> = arrayData[indexPath.row] as!       Dictionary<String, String>

    let nameLb:UILabel = cell.viewWithTag(100) as! UILabel;

    nameLb.text = "\(dic["name"]!))"

    return cell;
}




   func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

    if(searchText.isEmpty)
    {


    }
      else {



       }

    tableView.reloadData()
}

1 Ответ

0 голосов
/ 22 января 2019

Вам необходимо поддерживать две структуры данных; один - ваши фактические данные, а другой - источник данных для вашего табличного представления. Если поиск / запрос не предоставлен, вы передаете полный набор результатов источнику данных. Когда вводится запрос, вы фильтруете по полному набору данных, извлекаете совпадения и затем подаете это подмножество в свой источник данных.

Вы также можете реализовать протокол 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);
    }

}
...