问题是,如果用户搜索某些内容然后单击该表格的单元格,当它转移到新视图时,搜索栏就会位于该位置.理想情况下,我希望在用户搜索时导航栏被搜索栏“替换”,然后在用户点击单元格时返回导航栏,然后在用户单击时返回搜索栏“返回键. (这是现在已弃用的UISearchdisplayController的工作方式.)如何实现这一目标?这是我的表视图的控制器.
class ItemSearchViewController: UITableViewController,UISearchResultsUpdating { var searchController: UISearchController? let itemList = [ItemList(category:"Chocolate",name:"chocolate Bar",price: 1234),ItemList(category:"Chocolate",name:"chocolate Chip",name:"dark chocolate",ItemList(category:"Hard",name:"lollipop",name:"candy cane",name:"jaw breaker",ItemList(category:"Other",name:"caramel",name:"sour chew",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() } }
解决方法
definesPresentationContext = true
来自definesPresentationContext的文档
A Boolean value that indicates whether this view controller’s view is covered when the view controller or one of its descendants presents a view controller.
讨论
When a view controller is presented,iOS starts with the presenting view controller and asks it if it wants to provide the presentation
context. If the presenting view controller does not provide a context,
then iOS asks the presenting view controller’s parent view
controller. iOS searches up through the view controller hierarchy
until a view controller provides a presentation context. If no view
controller offers to provide a context,the window’s root view
controller provides the presentation context.If a view controller returns true,then it provides a presentation context. The portion of the window covered by the view controller’s view determines the size of the presented view controller’s view. The default value for this property is false.