Ios 将UISearchController与UINavigationController一起使用
我的问题和,没有任何答案。(将Ios 将UISearchController与UINavigationController一起使用,ios,uitableview,uinavigationcontroller,segue,uisearchcontroller,Ios,Uitableview,Uinavigationcontroller,Segue,Uisearchcontroller,我的问题和,没有任何答案。(将searchController.active设置为false将清除我不需要的搜索文本。)我想使用UISearchController,以便用户可以在我的UITableView中搜索项目列表。我在界面生成器中连接了一个show segue,当选择表视图的单元格时会触发它。 问题是,如果用户搜索某个内容,然后单击表中的某个单元格,当它转到新视图时,搜索栏就在那里。理想情况下,我希望在用户搜索时用搜索栏“替换”导航栏,然后在用户单击单元格时返回导航栏,然后在用户单击“返
searchController.active
设置为false
将清除我不需要的搜索文本。)我想使用UISearchController,以便用户可以在我的UITableView中搜索项目列表。我在界面生成器中连接了一个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()
}
}
在
viewDidLoad()中添加此行
从文档中获取
一个布尔值,指示当视图控制器或其子体之一显示视图控制器时,是否覆盖此视图控制器的视图
讨论
当显示视图控制器时,iOS从显示视图控制器开始,询问它是否要提供显示
上下文如果呈现视图控制器不提供上下文,
然后iOS询问呈现视图控制器的父视图
控制器。iOS在视图控制器层次结构中向上搜索
直到视图控制器提供了表示上下文。如果没有视图
控制器提供了一个上下文,即窗口的根视图
控制器提供表示上下文
如果视图控制器返回true,则它将提供一个表示
上下文视图控制器所覆盖的窗口部分
视图确定显示的视图控制器视图的大小。
此属性的默认值为false
definesPresentationContext = true