我使用UISearchController
和UITableView
创建了一个视图控制器。您可以从搜索范围按钮中选择两种不同类型的搜索:组和人员。两种搜索都可以在桌面上显示并显示结果。但是,如果单击每个单元格,则应将它们定向到不同的动态页面(动态组页面或动态人员配置文件页面)。用于组的工作,而用于配置文件的工作则不工作。这意味着每当我从我得到的结果中点击一个人单元格时,没有任何反应,我在控制台上打印出以下警告:
Warning: Attempt to present <MyProject.profileView: 0x13e9df000> on <MyProject.SearchPage: 0x142a1d8f0> which is already presenting <UISearchController: 0x142a1f7c0>
如果您知道为什么会发生这种情况,如果您能让我知道,我们将非常感激。
编辑:这是应该将单元格链接到不同视图控制器的函数:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if self.searchForGroups {
let detailCell:PFObject = self.filteredGroups.objectAtIndex(indexPath.row) as! PFObject
let vc = self.storyboard!.instantiateViewControllerWithIdentifier("DynamicCellView") as! DynamicCellView
vc.GroupId = detailCell.objectId!
self.presentViewController(vc, animated: false, completion: nil)
}else{
//Link to use profile
let user = self.peopleResults[indexPath.row]
let vc = self.storyboard!.instantiateViewControllerWithIdentifier("ProfileView") as! profileView
vc.profileId = user.objectId!
self.presentViewController(vc, animated: true, completion: nil)
}
}
答案 0 :(得分:10)
我收到了同样的警告,并为我解决了这个问题。您需要停止显示搜索控制器,以便在离开视图时显示其他控制器。
override func viewDidDisappear(_ animated: Bool) {
if SearchController.isActive == true {
SearchController.isActive = false
}
}
答案 1 :(得分:6)
我正在想出同样的原始问题,但这一切都没有为我解决。
实际上你只需要解雇 UISearchController ,因为它已经显示在当前视图中。
因此,当您想要启动操作时,您只需要调用它:
if searchController.isActive {
self.searchController.dismiss(animated: false) {
// Do what you want here like perform segue or present
}
}
希望这会有所帮助!
答案 2 :(得分:0)
没有代码有点难以帮助你。可能会发生该错误,因为您正在破坏视图控制器层次结构。
消息是说您有3个视图控制器:
SearchPage is presenting UISearchController
profileView is not yet presented but should be presented on UISearchController or should replace it (For that UISearchController should be dismissed first)
请记住,视图控制器当时只能显示1个视图控制器,但它可以有多个子视图控制器(例如导航控制器)。
正如评论一样,使用大写字母(&#39; ProfileView&#39;而不是&#39; profileView&#39;)启动您的班级名称是一个很好的编码习惯。
答案 3 :(得分:0)
我在点击搜索结果时尝试执行segue时遇到了同样的错误。这不是一个理想的解决方法,但在执行segue之前解雇了searchController,为我修复了它:
self.searchController.dismiss(animated: false) {
self.performSegue(withIdentifier: "<YOUR SEGUE IDENTIFIER>", sender: cell)
}
答案 4 :(得分:0)
我不确定以上答案在以前的版本中是否能正常工作,但在迅速的5中,调用dismiss将导致segue正确触发,但搜索栏将保持激活状态,并在它们消除触发的segue时返回(返回搜索页面),搜索栏看起来会处于活动状态,但搜索结果却不会。
也无法从viewDidDisappear()解散。这是我的方法。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
//Do some stuff here
if searchController.isActive{
searchController.isActive = false
}
performSegue(withIdentifier: "<yourSegueIdentifierHere>", sender: nil)
}
答案 5 :(得分:0)
关闭UISearchController(此线程以多种方式提出)是一种可行的解决方案。我发现的另一种解决方法是
definesPresentationContext = true
具有UISearchController的View Controller的 viewDidLoad()中的。一旦您向后导航,UISearchController仍会显示搜索结果,那么这种解决方法会更好。