Как обновить результаты поиска при изменении кнопки 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 7

1 ответ:

Поведение, которое вы ожидаете, логично и кажется на первый взгляд правильным, но на самом деле это не так.

Вот описание метода Apple:

Вызывается, когда строка поиска становится первым ответчиком или когда пользователь вносит изменения внутри строки поиска.

Изменение области-это изменение в строке поиска, верно? Для меня это имеет смысл. Но если Вы читаете дискуссию , Apple дает понять, что поведение-это не то, что вы ожидаете:

Этот метод автоматически вызывается всякий раз, когда строка поиска становится первым ответчиком или в текст в строке поиска вносятся изменения.

Не входит в это: изменения в области применения. Странно упускать из виду, не правда ли? Либо метод должен вызываться при изменении области видимости, либо в сводке должно быть ясно, что это не так.

Вы можете получить желаемое поведение, добавив протокол UISearchBarDelegate к контроллер вида и настройка searchController.searchBar.delegate для контроллера вида.

Затем добавьте следующее:

func searchBar(searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
    updateSearchResultsForSearchController(searchController)
}

Это приведет к тому, что updateSearchResultsForSearchController будет срабатывать всякий раз, когда область изменяется, как вы и ожидали. Но вместо этого, возможно, вы захотите разложить мясо updateSearchResultsForSearchController на новый метод, который вызовут и updateSearchResultsForSearchController, и selectedScopeButtonIndexDidChange.