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

Другие вопросы по тегам