updateSearchResultsForSearchController не вызывается в iOS 9

Я пытаюсь написать простой UITableView с UISearchBar. У меня нет проблем, когда я перетаскиваю UITableViewController. Все работает! (см. код ниже)

override func viewDidLoad() {
    super.viewDidLoad()

    self.searchResultsController = UISearchController(searchResultsController: nil) //initialize the search controller
    self.searchResultsController.searchResultsUpdater = self //the search controller updater is this view
    self.searchResultsController.dimsBackgroundDuringPresentation = false
    self.searchResultsController.searchBar.sizeToFit()
    self.searchResultsController.searchBar.searchBarStyle = UISearchBarStyle.Minimal
    self.searchResultsController.searchBar.showsCancelButton = true

    self.tableView.tableHeaderView = searchResultsController.searchBar
    self.tableView.reloadData()
}

Но теперь, в экспериментальных целях, я использовал UIViewController и добавил UITableView, без проблем с отображением моих записей в таблице.

Затем добавил UISearchBar из раскадровки, установил его делегат на UIViewController, но метод updateSearchResultsForSearchController не вызывается, когда пользователь что-то вводит.

Это похоже на то, что мой UISearchController понятия не имеет, что есть UISearchBar, и что бы я ни вводил, не вызывает метод обновления. Должен ли я сказать UISearchController, что это ваш UISearchBar?

Итак, вот мой код:

class SearchViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchResultsUpdating, UISearchBarDelegate, UISearchControllerDelegate

{

@IBOutlet weak var mySearchBar: UISearchBar!
@IBOutlet weak var myViewTable: UITableView!

let allElements = ["H", "Li", "Na", "K", "Rb", "Cs", "Fr"]
var filteredElemetns = [String]()
var searchResultsController = UISearchController() //create a new search controller

override func viewDidLoad()
{
    super.viewDidLoad()

    self.searchResultsController = UISearchController(searchResultsController: nil) //initialize the search controller
    self.searchResultsController.searchResultsUpdater = self //the search controller updater is this view
    self.searchResultsController.dimsBackgroundDuringPresentation = false
    self.searchResultsController.searchBar.sizeToFit()
    self.searchResultsController.searchBar.searchBarStyle = UISearchBarStyle.Minimal
    self.searchResultsController.searchBar.delegate = self

    //self.myViewTable.tableHeaderView = self.searchResultsController.searchBar
}

Если я раскомментирую последнюю строку, то у меня будет два UISearchBar, один из которых добавляется раскадровкой, а другой - с кодом последней строки. Тот, что я добавил, не работает, а тот, что вверху myViewTable, работает.


person Kasra Babaei    schedule 21.04.2016    source источник
comment
соответствует ли ваш класс протоколам UISearchResultsUpdating, UISearchControllerDelegate?   -  person MDB983    schedule 21.04.2016
comment
отсутствует searchController.searchBar.delegate = self?   -  person Ulli H    schedule 21.04.2016
comment
Я использовал раскадровку для установки делегата, но также попробовал это программно, не сработало   -  person Kasra Babaei    schedule 21.04.2016
comment
Какую панель поиска вы использовали из раскадровки, обычную панель поиска или панель поиска и контроллер отображения поиска?   -  person ishdeep bhandari    schedule 21.04.2016
comment
Обычная панель поиска, вторая устарела.   -  person Kasra Babaei    schedule 21.04.2016


Ответы (1)


Хорошо, я нашел решение.

Я использовал свой алгоритм фильтрации внутри функции searchBar:textDidChange. Потом все заработало, и функция updateSearchResultsForSearchController мне больше не нужна. Вот мой код:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String)
{
    print("filtering...")
    self.filteredElemetns.removeAll(keepCapacity: false) //remove all the elements

    let searchPredict = NSPredicate(format: "SELF CONTAINS [c] %@", self.mySearchBar.text!)

    print(searchPredict)

    let foundElements = (self.allElements as NSArray).filteredArrayUsingPredicate(searchPredict)

    self.filteredElemetns = foundElements as! [String]

    self.myViewTable.reloadData()
}

Конечно, не забудьте убедиться, что ваш класс соответствует протоколу UISearchBarDelegate.

Я нахожу этот подход лучше, чем использование UITableViewController. Одна из причин, если вы поищите, то обнаружите, что многие люди не могут сделать UISearchBar первым ответчиком. Я обнаружил, что единственным решением этой проблемы является вызов becomeFirstResponder после задержки, что на самом деле не является хорошим подходом к программированию.

Но при таком подходе вы можете сделать выход из своего UISearchBar, а затем легко сделать его первым ответчиком в viewDidAppear.

Я знаю, что некоторые люди могут сказать, что нет, вы можете легко сделать UISearchBar первым ответившим, даже если вы используете UISearchResultsController, выполнив что-то вроде:

self.searchResultsController.searchBar.becomeFirstResponder()
self.searchResultsController.active = true

Но поверьте в iOS 8/9 это не так просто, не получится. Попробуй это...

person Kasra Babaei    schedule 21.04.2016
comment
Так в чем причина того, что updateSearchResultsForSearchController не вызывался? - person G.Abhisek; 01.09.2016