Как реализовать UISearchController в UITableView-Swift

Я новичок в Swift и я пытаюсь добавить функцию поиска на мой UITableView который находится в UIViewController класса. Я много гуглил и нашел это UISearchDisplayController был устаревшим и заменен UISearchController. Когда я пытался искать учебники, я не нашел никаких специально для UITableView. Некоторые из них были для реализации в UITableViewController. Итак, вот мои вопросы:

  1. можем ли мы реализовать UISearchController на UITableView это в UIViewController класса? (Я думаю, мы может)

  2. если мы можем, пожалуйста, преобразуйте эти строки кодов, написанных в Objective-C. Или если есть некоторые действительно хорошие учебники, пожалуйста, дайте мне знать.

    @property (strong, nonatomic) UISearchController *searchController;
    
    UITableViewController *searchResultsController = [[UITableViewController alloc] init];
    
    // Init UISearchController with the search results controller
     self.searchController = [[UISearchController alloc] initWithSearchResultsController:searchResultsController];
    
    // Link the search controller
    self.searchController.searchResultsUpdater = self;
    

источник

EDIT: Я пытаюсь назначить обновление результатов поиска в as

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchResultsUpdating {

    override func viewDidLoad() {

       super.viewDidLoad()
       self.view.backgroundColor = UIColor.blackColor() 
       self.addTableViewWithSection() 
       self.searchResultsController = UITableViewController()           
       var controller = UISearchController(searchResultsController: nil)            
       controller.searchResultsUpdater = self           
       controller.dimsBackgroundDuringPresentation = false   
    }
}

* однако на линейном контроллере.searchResultsUpdater = self я получаю eroor, так как не могу присвоить значение typ "ViewController" до значения типа"UISearchResultsUpdating?".. Поэтому я действительно сомневаюсь, что могу использовать UISearchController на UIViewController тип класса.

3 ответов


да, способ работы поиска был радикально изменен для того, что я считаю лучшей системой. Новая система намного лучше и прямо к месту для большинства простых реализаций. Использование его довольно просто.

во-первых, сделайте ваш класс соответствовать UISearchResultsUpdating протокол.

class MyTableViewController: UITableViewController, UISearchResultsUpdating {}

добавить его свойство контроллера поиска:

class MyTableViewController: UTableViewController, UISearchResultsUpdating {
    let searchController = UISearchController(searchResultsController: nil)
}

добавить строку поиска в viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()

    searchController.searchResultsUpdater = self
    searchController.hidesNavigationBarDuringPresentation = false
    searchController.dimsBackgroundDuringPresentation = false
    searchController.searchBar.sizeToFit()
    self.tableView.tableHeaderView = searchController.searchBar
}

и наконец, реализовать updateSearchResults:for метод, который исходит из UISearchResultsUpdating протокол:

func updateSearchResults(for searchController: UISearchController) {

}

ваша реализация этого метода будет, конечно, зависеть от того, где вы ищете данные. Он обновит ваше текущее представление таблицы с содержимым вашего поиска по мере их ввода. Убедитесь, что вы обновили источник данных и перезагрузили представление таблицы в updateSearchResultsForSearchController метод. Опять же, он обновляется по мере ввода, поэтому убедитесь, что если ваши данные для поиска большие или если вы ищете из интернет, добавьте некоторый параллелизм в этот метод.

если вы хотите использовать другой контроллер для заполнения результатов поиска, вы можете передать этот VC при инициализации searchController собственность.

редактировать: я перечитал ваш вопрос и, похоже, я забыл добавить кое-что важное.

UITableViewController имеет член с именем tableView. Вы можете захватить представление таблицы контроллера, но заполнить свой UITableView, вам не надо прикоснуться к нему. Вы не можете использовать логику SearchController напрямую С UITableView. Ты должен работать с контроллером, чтобы получить его. Используйте делегат UITableViewController и методы источника данных, чтобы обновить пользовательский интерфейс таблицы с результатами поиска.

пожалуйста, прочитайте с помощью UITableViewController, UITableViewDelegate и UITableViewDataSource, чтобы вы могли понять, как получить результаты поиска там.


в случае любой, кто бесится вокруг меня..этот код может помочь

class ViewController: UIViewController , UITableViewDataSource, UITableViewDelegate,UISearchResultsUpdating {

    @IBOutlet weak var tblView: UITableView!

    var tabledata = ["lucques","chickendijon","godaddy","amazon","chris","ambata","bankofamerica","abelcine","AUTO + TRANSPORTATION","BILLS + UTILITIES","FOOD + DINING","HEALTH","AutoCare", "Auto Payment" , "Gas+Fuel","Electric Bill", "Internet/Television","Fast Foodd", "Gorceries" , "Restaurants","Gym Membership", "Health Insurance","auto","note-bullet","knife","heart"]

    var filteredTableData = [String]()
    var resultSearchController = UISearchController()

    override func viewDidLoad() {
        super.viewDidLoad()
        tblView.delegate = self
        tblView.dataSource = self
        self.resultSearchController = ({
            let controller = UISearchController(searchResultsController: nil)
            controller.searchResultsUpdater = self
            controller.dimsBackgroundDuringPresentation = false
            controller.searchBar.sizeToFit()
            controller.searchBar.barStyle = UIBarStyle.Black
            controller.searchBar.barTintColor = UIColor.whiteColor()
            controller.searchBar.backgroundColor = UIColor.clearColor()
            self.tblView.tableHeaderView = controller.searchBar
            return controller
        })()
        self.tblView.reloadData()
    }

     func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if self.resultSearchController.active {
           return self.filteredTableData.count
        }else{
            return self.tabledata.count
       }
    }
     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var section = indexPath.section
        var row = indexPath.row
        let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier:"addCategoryCell")
        cell.selectionStyle =  UITableViewCellSelectionStyle.None
        cell.backgroundColor = UIColor.clearColor()
        cell.contentView.backgroundColor = UIColor.clearColor()
        cell.textLabel?.textAlignment = NSTextAlignment.Left
        cell.textLabel?.textColor = UIColor.blackColor()
        cell.textLabel?.font = UIFont.systemFontOfSize(14.0)

        if self.resultSearchController.active {
              cell.textLabel?.text = filteredTableData[indexPath.row]
        } else {
                 cell.textLabel?.text = tabledata[indexPath.row]
        }
        return cell
    }

    func updateSearchResultsForSearchController(searchController: UISearchController) {
        filteredTableData.removeAll(keepCapacity: false)
        let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text)
        let array = (tabledata as NSArray).filteredArrayUsingPredicate(searchPredicate)
        filteredTableData = array as! [String]
        self.tblView.reloadData()

    }
}

для тех, кто ищет немного больше контекста по всем аспектам реализации этого, вот учебник о том, как реализовать UISearchController

кроме приведенный выше ответ Энди Ибаньеса, вам также нужно добавить код к вашим методам UITableViewDataSource, чтобы показать новые отфильтрованные результаты в tableview.

кроме того, не забудьте позвонить tableView.reloadData() в вашем методе updateSearchResults-UISearchController не делает автоматически скажите tableView перезагрузить свои данные.