范围按钮更改时如何更新搜索结果.Swift UISearchController

aXX*_*XXy 7 scope swift uisearchcontroller

如何更改范围按钮(在点击范围后)更新搜索结果?当我再次输入时,搜索结果已更改(使用新范围)!

searchControl - config import 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()


    }
Run Code Online (Sandbox Code Playgroud)

更新功能当我输入文本时,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()
}
Run Code Online (Sandbox Code Playgroud)

过滤功能

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

        })
    }
Run Code Online (Sandbox Code Playgroud)

请帮帮我!

Ste*_*her 12

你期望的行为是合乎逻辑的,表面看起来是正确的,但实际上并非如此.值得庆幸的是,有一个简单的解决方法.

这是Apple对该方法的描述:

当搜索栏成为第一响应者或用户在搜索栏内进行更改时调用.

范围更改是搜索栏中的更改,对吧?我感觉合理.但如果您阅读讨论,Apple会明确表示行为不符合您的期望:

只要搜索栏成为第一响应者或对搜索栏中的文本进行了更改,就会自动调用此方法.

不包括在内:对范围的更改.奇怪的是要忽视,不是吗?要么在更改范围时调用该方法,要么应该清除摘要,而不是.

您可以通过将UISearchBarDelegate协议添加到视图控制器并设置searchController.searchBar.delegate到视图控制器来获得所需的行为.

然后添加:

func searchBar(searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
    updateSearchResultsForSearchController(searchController)
}
Run Code Online (Sandbox Code Playgroud)

updateSearchResultsForSearchController每当范围发生变化时,这将导致被触发,正如您所期望的那样.但是相反,你可能想的肉因素updateSearchResultsForSearchController成两个新的方法updateSearchResultsForSearchControllerselectedScopeButtonIndexDidChange调用.