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
делает.
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 все не так просто, это не сработает. Попытайся...