Как обновить результаты поиска при изменении кнопки scope. Свифт UISearchController
Как обновить результаты поиска при изменении кнопки scope (после моего нажатия на scope)? Результаты поиска изменились (с новой областью), когда я снова набираю!
SearchControl-config импорт UIKit
class ProductTableView: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchResultsUpdating
{
@IBOutlet weak var tableView: UITableView!
var searchController: UISearchController!
var friendsArray = [FriendItem]()
var filteredFriends = [FriendItem]()
override func viewDidLoad()
{
super.viewDidLoad()
searchController = UISearchController(searchResultsController: nil)
searchController.searchBar.sizeToFit()
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
searchController.searchBar.scopeButtonTitles = ["Title","SubTitle"]
definesPresentationContext = true
tableView.tableHeaderView = searchController.searchBar
self.tableView.reloadData()
}
Функция Обновления При вводе текста NSLog выводит мой текст и номер области. Когда я меняю сферу действия-ничего!!!
func updateSearchResultsForSearchController(searchController: UISearchController) {
let searchText = searchController.searchBar.text
let scope = searchController.searchBar.selectedScopeButtonIndex
NSLog("searchText - (searchText)")
NSLog("scope - (scope)")
filterContents(searchText, scope: scope)
tableView.reloadData()
}
Функция фильтра
func filterContents(searchText: String, scope: Int)
{
self.filteredFriends = self.friendsArray.filter({( friend : FriendItem) -> Bool in
var fieldToSearch: String?
switch (scope){
case (0):
fieldToSearch = friend.title
case(1):
fieldToSearch = friend.subtitle
default:
fieldToSearch = nil
}
var stringMatch = fieldToSearch!.lowercaseString.rangeOfString(searchText.lowercaseString)
return stringMatch != nil
})
}
Помогите мне, пожалуйста!
1 ответ:
Поведение, которое вы ожидаете, логично и кажется на первый взгляд правильным, но на самом деле это не так.
Вот описание метода Apple:
Вызывается, когда строка поиска становится первым ответчиком или когда пользователь вносит изменения внутри строки поиска.
Изменение области-это изменение в строке поиска, верно? Для меня это имеет смысл. Но если Вы читаете дискуссию , Apple дает понять, что поведение-это не то, что вы ожидаете:
Этот метод автоматически вызывается всякий раз, когда строка поиска становится первым ответчиком или в текст в строке поиска вносятся изменения.Не входит в это: изменения в области применения. Странно упускать из виду, не правда ли? Либо метод должен вызываться при изменении области видимости, либо в сводке должно быть ясно, что это не так.
Вы можете получить желаемое поведение, добавив протокол UISearchBarDelegate к контроллер вида и настройка
searchController.searchBar.delegate
для контроллера вида.Затем добавьте следующее:
func searchBar(searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) { updateSearchResultsForSearchController(searchController) }
Это приведет к тому, что
updateSearchResultsForSearchController
будет срабатывать всякий раз, когда область изменяется, как вы и ожидали. Но вместо этого, возможно, вы захотите разложить мясоupdateSearchResultsForSearchController
на новый метод, который вызовут иupdateSearchResultsForSearchController
, иselectedScopeButtonIndexDidChange
.