将 UISearchController 与 UINavigationController 一起使用
Posted
技术标签:
【中文标题】将 UISearchController 与 UINavigationController 一起使用【英文标题】:Using UISearchController with UINavigationController 【发布时间】:2015-04-14 04:02:24 【问题描述】:我遇到了与here 相同的问题,它没有任何答案。 (将 searchController.active
设置为 false
会清除我不想要的搜索文本。)我想使用 UISearchController 以便用户可以搜索我的 UITableView 中的项目列表。我在 Interface Builder 中连接了一个 show segue,它在选择表视图的单元格时触发。
问题是,如果用户搜索某些内容,然后单击表格的一个单元格,当它转到新视图时,搜索栏就坐在那里。理想情况下,我希望导航栏在用户搜索时被搜索栏“替换”,然后在用户单击单元格时返回导航栏,然后在用户单击时返回搜索栏“返回键。 (这是现在已弃用的 UISearchDisplayController 的工作方式。)我怎样才能做到这一点?这是我的表格视图的控制器。
class ItemSearchViewController: UITableViewController, UISearchResultsUpdating
var searchController: UISearchController?
let itemList = [ItemList(category:"Chocolate", name:"chocolate Bar", price: 1234),
ItemList(category:"Chocolate", name:"chocolate Chip", price: 1234),
ItemList(category:"Chocolate", name:"dark chocolate", price: 1234),
ItemList(category:"Hard", name:"lollipop", price: 1234),
ItemList(category:"Hard", name:"candy cane", price: 1234),
ItemList(category:"Hard", name:"jaw breaker", price: 1234),
ItemList(category:"Other", name:"caramel", price: 1234),
ItemList(category:"Other", name:"sour chew", price: 1234),
ItemList(category:"Other", name:"gummi bear", price: 1234)]
var filteredList : [ItemList] = []
override func viewDidLoad()
super.viewDidLoad()
self.title = "Item Search"
self.tableView.delegate = self
self.tableView.dataSource = self
self.searchController = UISearchController(searchResultsController: nil)
self.searchController!.searchResultsUpdater = self
self.searchController!.hidesNavigationBarDuringPresentation = true
self.searchController!.dimsBackgroundDuringPresentation = false
self.searchController!.searchBar.searchBarStyle = .Minimal
self.searchController!.searchBar.sizeToFit()
self.tableView.tableHeaderView = self.searchController!.searchBar
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
if (segue.identifier == "itemDetail")
let itemDetailViewController = segue.destinationViewController as UIViewController
let selectedCell = sender as UITableViewCell
itemDetailViewController.title = selectedCell.textLabel?.text
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell") as UITableViewCell
var item : ItemList
if self.searchController!.active
item = self.filteredList[indexPath.row]
else
item = self.itemList[indexPath.row]
cell.textLabel!.text = item.name
return cell
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
if (self.searchController!.active)
return self.filteredList.count
else
return self.itemList.count
extension ItemSearchViewController: UISearchResultsUpdating
func updateSearchResultsForSearchController(searchController: UISearchController)
if (searchController.searchBar.text.isEmpty)
self.filteredList = self.itemList
else
let searchPredicate =
(item: ItemList) -> Bool in
item.name.rangeOfString(searchController.searchBar.text, options: .CaseInsensitiveSearch) != nil
self.filteredList = self.itemList.filter(searchPredicate)
self.tableView.reloadData()
【问题讨论】:
【参考方案1】:在viewDidLoad()
中添加这一行
definesPresentationContext = true
来自definesPresentationContext的文档
一个布尔值,指示当视图控制器或其后代之一呈现视图控制器时是否覆盖此视图控制器的视图。
讨论
当一个视图控制器被呈现时,ios 从呈现视图控制器开始并询问它是否要提供呈现 语境。如果呈现视图控制器不提供上下文, 然后 iOS 询问呈现视图控制器的父视图 控制器。 iOS 向上搜索视图控制器层次结构 直到视图控制器提供表示上下文。如果没有视图 控制器提供上下文,即窗口的根视图 控制器提供演示上下文。
如果视图控制器返回 true,那么它提供了一个演示文稿 语境。视图控制器覆盖的窗口部分 view 确定呈现的视图控制器视图的大小。 此属性的默认值为 false。
【讨论】:
以上是关于将 UISearchController 与 UINavigationController 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
带有 UITableView ui 故障的 UISearchController
将 UISegmentedControl 与 UISearchController 一起使用
将 UISearchController 与 UINavigationController 一起使用