如何从嵌入在父视图控制器的子视图控制器中的 UISearchViewController 中呈现视图控制器?
How do I present a view controller from UISearchViewController embedded in a child view controller of a parent view controller?
我有一个名为 MainViewController 的父视图控制器和一个名为 FilterViewController 的子视图控制器,它占据了主控制器屏幕的一部分。
在 filterViewController 中,我向 table 视图添加了一个 UISearchController。但是当我点击搜索结果转到 DetailViewController
Attempt to present <MyApp.DetailViewController: 0x7f97ae057780> on <MyApp.FilterViewController: 0x7f97abd62b40> which is already presenting <UISearchController: 0x7f97abd85270>
我在 iPad iOS 8 模拟器上使用它。
如果 resultSearchController 未激活,我可以单击 table,它会转到我显示的任何内容,但不知何故这个 uisearchcontroller 不允许我这样做,有什么解决方法?
代码:
MainViewController.swift
func addFilterViewController(){
filterViewController = self.storyboard?.instantiateViewControllerWithIdentifier("filterviewcontroller") as! FilterViewController
filterViewController.mainViewController = self
self.addChildViewController(filterViewController)
filterViewController.view.frame = CGRectMake(self.view.frame.width*2/3, 0, self.view.frame.width/3, self.view.frame.height)
self.view.addSubview(filterViewController.view)
filterViewController.didMoveToParentViewController(self)
}
FilterViewController.swift
func setUpSearchBar() {
resultSearchController = UISearchController(searchResultsController: nil)
resultSearchController.searchResultsUpdater = self
resultSearchController.dimsBackgroundDuringPresentation = false
let searchBar = self.resultSearchController.searchBar
searchBar.sizeToFit()
searchBar.backgroundImage = UIImage()
searchBar.barTintColor = UIColor.clearColor()
searchBar.backgroundColor = UIColor.lightBlue()
searchBar.placeholder = "Type to search"
filterTable.tableHeaderView = searchBar
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if resultSearchController.active {
println("search table select")
let detailVC = self.storyboard?.instantiateViewControllerWithIdentifier("detailViewController") as! DetailViewController
detailVC.card = filteredCards[indexPath.row]
// this has same problem if I pass in the MainViewController and do mainViewController.presentViewController...
self.presentViewController(detailVC, animated: false, completion: nil)
} else {
// other code
}
filterTable.deselectRowAtIndexPath(indexPath, animated: true)
}
func updateSearchResultsForSearchController(searchController: UISearchController) {
self.filteredCards = self.unorderedCards.filter{
(card: Card) -> Bool in
let name = card.firstName + card.lastName
let stringMatch = tributeName.lowercaseString.rangeOfString(searchController.searchBar.text.lowercaseString)
return (stringMatch != nil)
}
filterTable.reloadData()
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if resultSearchController.active {
return filteredCards.count
} else {
return unOrderedCards.count
}}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("filtercell", forIndexPath: indexPath) as! FilterCell
cell.backgroundColor = UIColor.lightBlue()
if resultSearchController.active {
let card = filteredCards[indexPath.row]
cell.name.text = card.firstName
} else {
let card = unOrderedCards[indexPath.row]
cell.name.text = card.firstName
}
return cell
}
如果问题是视图控制器尚未显示 resultSearchController,为什么不让 resultSearchController 显示新的 vc?
resultSearchController.presentViewController(detailVC, animated: false, completion: nil)
然后,如果您需要从 resultSearchController 中关闭,只需创建一个新的 class 继承自 UISearchController。
我有一个名为 MainViewController 的父视图控制器和一个名为 FilterViewController 的子视图控制器,它占据了主控制器屏幕的一部分。
在 filterViewController 中,我向 table 视图添加了一个 UISearchController。但是当我点击搜索结果转到 DetailViewController
Attempt to present <MyApp.DetailViewController: 0x7f97ae057780> on <MyApp.FilterViewController: 0x7f97abd62b40> which is already presenting <UISearchController: 0x7f97abd85270>
我在 iPad iOS 8 模拟器上使用它。 如果 resultSearchController 未激活,我可以单击 table,它会转到我显示的任何内容,但不知何故这个 uisearchcontroller 不允许我这样做,有什么解决方法?
代码: MainViewController.swift
func addFilterViewController(){
filterViewController = self.storyboard?.instantiateViewControllerWithIdentifier("filterviewcontroller") as! FilterViewController
filterViewController.mainViewController = self
self.addChildViewController(filterViewController)
filterViewController.view.frame = CGRectMake(self.view.frame.width*2/3, 0, self.view.frame.width/3, self.view.frame.height)
self.view.addSubview(filterViewController.view)
filterViewController.didMoveToParentViewController(self)
}
FilterViewController.swift
func setUpSearchBar() {
resultSearchController = UISearchController(searchResultsController: nil)
resultSearchController.searchResultsUpdater = self
resultSearchController.dimsBackgroundDuringPresentation = false
let searchBar = self.resultSearchController.searchBar
searchBar.sizeToFit()
searchBar.backgroundImage = UIImage()
searchBar.barTintColor = UIColor.clearColor()
searchBar.backgroundColor = UIColor.lightBlue()
searchBar.placeholder = "Type to search"
filterTable.tableHeaderView = searchBar
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if resultSearchController.active {
println("search table select")
let detailVC = self.storyboard?.instantiateViewControllerWithIdentifier("detailViewController") as! DetailViewController
detailVC.card = filteredCards[indexPath.row]
// this has same problem if I pass in the MainViewController and do mainViewController.presentViewController...
self.presentViewController(detailVC, animated: false, completion: nil)
} else {
// other code
}
filterTable.deselectRowAtIndexPath(indexPath, animated: true)
}
func updateSearchResultsForSearchController(searchController: UISearchController) {
self.filteredCards = self.unorderedCards.filter{
(card: Card) -> Bool in
let name = card.firstName + card.lastName
let stringMatch = tributeName.lowercaseString.rangeOfString(searchController.searchBar.text.lowercaseString)
return (stringMatch != nil)
}
filterTable.reloadData()
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if resultSearchController.active {
return filteredCards.count
} else {
return unOrderedCards.count
}}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("filtercell", forIndexPath: indexPath) as! FilterCell
cell.backgroundColor = UIColor.lightBlue()
if resultSearchController.active {
let card = filteredCards[indexPath.row]
cell.name.text = card.firstName
} else {
let card = unOrderedCards[indexPath.row]
cell.name.text = card.firstName
}
return cell
}
如果问题是视图控制器尚未显示 resultSearchController,为什么不让 resultSearchController 显示新的 vc?
resultSearchController.presentViewController(detailVC, animated: false, completion: nil)
然后,如果您需要从 resultSearchController 中关闭,只需创建一个新的 class 继承自 UISearchController。