在 iOS 9 中未调用 updateSearchResultsForSearchController

Posted

技术标签:

【中文标题】在 iOS 9 中未调用 updateSearchResultsForSearchController【英文标题】:updateSearchResultsForSearchController not called in iOS 9 【发布时间】:2016-04-21 13:51:13 【问题描述】:

我正在尝试用UISearchBar 编写一个简单的UITableView。拖放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 顶部的那个起作用。

【问题讨论】:

你的类是否符合 UISearchResultsUpdating、UISearchControllerDelegate 协议? 缺少 searchController.searchBar.delegate = self? 我用storyboard来设置delegate,也用编程方式试过,没用 您在故事板中使用了什么样的搜索栏,普通搜索栏或搜索栏和搜索显示控制器? 普通搜索栏,第二个已弃用。 【参考方案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 中的第一响应者。

我知道有些人可能会说不,即使您使用 UISearchResultsController,您也可以轻松地将 UISearchBar 设为第一响应者,方法如下:

self.searchResultsController.searchBar.becomeFirstResponder()
self.searchResultsController.active = true

但是,相信我,在 ios 8/9 中它不是那么简单,它不会工作。试试吧……

【讨论】:

那么 updateSearchResultsForSearchController 没有被调用的原因是什么?

以上是关于在 iOS 9 中未调用 updateSearchResultsForSearchController的主要内容,如果未能解决你的问题,请参考以下文章

iOS 9 中未调用 UITableViewCell 中的 IBAction

在 iOS 11 和 Xcode 9.1 中未调用 CLLocationManager 的 didUpdateLocations 委托 [重复]

准备(用于 segue:UIStoryboardSegue,发件人:任何?)在 iOS 11 上的 Xcode 9 b6 中未调用

“viewWillTransitionToSize:”当视图控制器以模态方式呈现时在 iOS 9 中未调用

在 iOS 15 中未分配 Alamofire 4.9.1 sessionManager.delegate.sessionDidReceiveChallenge

推送通知在 ios 9 中未显示 2kb