ios - UISearchController 仅在单击搜索按钮时更新

标签 ios swift uisearchcontroller

我有一个 UISearchController,它被配置为搜索非常大的数据数组。因此,当我在搜索栏中输入内容时,需要很长时间才能真正输入我的搜索内容。它对搜索字段中的每个字符条目执行搜索比较,这非常慢。

我想知道如何解决这个问题。我的想法是:

  1. 仅在用户完成输入并点击搜索按钮后执行搜索
  2. 在后台线程上执行搜索,释放主线程用于键盘输入

我想使用方法 1 但我似乎无法弄清楚如何使用新的 UISearchController 执行此操作。

下面是我的相关项目代码:

class AirportSearchTBVC: UITableViewController, UISearchResultsUpdating{
var airportData = [Dictionary<String, String>]()
var filteredData = [Dictionary<String, String>]()
var searchController = UISearchController()
override func viewDidLoad() {
    super.viewDidLoad()


    searchController = UISearchController(searchResultsController: nil)
    searchController.searchResultsUpdater = self

    searchController.dimsBackgroundDuringPresentation = false

    searchController.searchBar.sizeToFit()
    tableView.tableHeaderView = searchController.searchBar

    definesPresentationContext = true


    searchController.hidesNavigationBarDuringPresentation = false

    self.tableView.reloadData()
}

func updateSearchResultsForSearchController(searchController: UISearchController) {

    filteredData = []

    let searchPredicate = NSPredicate(format: "SELF CONTAINS[cd] %@", searchController.searchBar.text!)
    let array = (airportData as NSArray).filteredArrayUsingPredicate(searchPredicate)

    filteredData = array as! [Dictionary<String, String>]

    self.tableView.reloadData()

}

奖励问题 如果我搜索一个字符串,如果该字符串不完全匹配,它似乎不会返回任何结果。例如:“orida”找不到“Florida”。我的搜索谓词不应该使用 CONTAINS 找到它吗?

更新 这段代码几乎可以工作,但它基本上在后台线程上抛出一堆东西,然后通过它。键盘现在很活泼,但如果我在关闭并重新进入搜索栏时快速更改文本字段中的内容,它似乎会崩溃...

func updateSearchResultsForSearchController(searchController: UISearchController) {
    appDel.backgroundThread(background: {
        self.filteredData.removeAll(keepCapacity: false)

        let searchPredicate = NSPredicate(format: "SELF CONTAINS[cd] %@", searchController.searchBar.text!)
        let array = (self.airportData as NSArray).filteredArrayUsingPredicate(searchPredicate)

        self.filteredData = array as! [Dictionary<String, String>]
        },
        completion: {

            dispatch_async(dispatch_get_main_queue()) {
                    self.tableView.reloadData()
            }

    });






}

更新 2 在玩了一会儿之后,我能够通过等待 searchBar.text 长度 >= 3 个字符以及确保字符数在 updateSearchResultsForSearchController 的 1 秒内没有改变来让它正常工作:叫。这些组合以及集成搜索按钮执行命令应该可以解决我的问题。

func updateSearchResultsForSearchController(searchController: UISearchController) {
    let startCount = searchController.searchBar.text!.length
    delay(1) {
    if searchController.searchBar.text!.length >= 3 && searchController.searchBar.text!.length == startCount{
        self.view.addSubview(self.progressHud)
        self.appDel.backgroundThread(background: {
            self.filteredData.removeAll(keepCapacity: false)

            let searchPredicate = NSPredicate(format: "SELF CONTAINS[cd] %@", searchController.searchBar.text!)
            let array = (self.airportData as NSArray).filteredArrayUsingPredicate(searchPredicate)

            self.filteredData = array as! [Dictionary<String, String>]
            },
            completion: {
                dispatch_async(dispatch_get_main_queue()) {
                    self.tableView.reloadData()
                    self.progressHud.removeFromSuperview()
                }



        });
    }
    }





}
    func delay(delay:Double, closure:()->()) {
        dispatch_after(
            dispatch_time(
                DISPATCH_TIME_NOW,
                Int64(delay * Double(NSEC_PER_SEC))
            ),
            dispatch_get_main_queue(), closure)
    }

最佳答案

您可以使用委托(delegate)方法 searchBarSearchButtonPressed: 来监视何时按下搜索按钮。在执行此委托(delegate)方法时设置一个标志,然后在您的 searchBarTextDidChange: 方法中,您可以检查此标志以查看是否应执行搜索。当然,这只会在用户按下搜索键后进行搜索,而且大多数人都希望在输入时看到一些事情发生。

关于ios - UISearchController 仅在单击搜索按钮时更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33106427/

相关文章:

ios - swift OutputStream 找不到成员 "write"

ios - 选择 searchBar 时在 UISearchController 中预加载数据

swift - tvOS:有没有办法防止搜索键盘在滚动时折叠?

ios - 数据不会从 JSON 解析加载到某些 Tableview 单元格上

javascript - 如何将合金代码转换为经典钛

ios - CoreData 上的 Realm 我应该使用 NSFetchedResultController 还是字典?

ios - Xcode - 图像在用户选择后未出现在 UIImageView 中

swift - UISlider,保存状态

ios - 使用 AutoLayout 时显示和隐藏 View

ios - 在 iOS 8 上使用 swift 设置占位符文本颜色/隐藏取消按钮