在 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