swift2 警告:试图在 * 上显示视图控制器,而该控制器已显示〈UISearchController:0x142a1f7c0的最大值>

lnxxn5zx  于 2022-11-06  发布在  Swift
关注(0)|答案(6)|浏览(153)

我用UISearchControllerUITableView创建了一个视图控制器。从搜索范围按钮中可以选择两种不同的搜索:组和人员。这两种搜索都有效并在表中显示结果。但是,如果单击每个单元格,它们应将您引导到不同的动态页(动态群组页面或动态个人资料页面)。群组页面可以使用,而个人资料页面则不行。这意味着每当我点击搜索结果中的个人单元格时,没有任何React,并且控制台上显示以下警告:

Warning: Attempt to present <MyProject.profileView: 0x13e9df000>  on <MyProject.SearchPage: 0x142a1d8f0> which is already presenting <UISearchController: 0x142a1f7c0>

如果你知道为什么会发生这种事......如果你能让我知道,我会非常感激。
EDIT:下面是将单元格链接到不同视图控制器的函数:

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)
        }
    }
gwo2fgha

gwo2fgha1#

我有同样的警告,这为我修复了它。你需要停止显示搜索控制器,这样你就可以在离开视图时显示其他控制器。

override func viewDidDisappear(_ animated: Bool) {

                if SearchController.isActive == true {

                          SearchController.isActive = false

                 }
          }
s2j5cfk0

s2j5cfk02#

我正在计算同样的原始问题,这一切都没有解决它为我。
实际上,您只需要关闭*UISearchController**,因为它已经呈现给当前视图。
所以,当你想发起你的行动时,你只需要调用这个:

if searchController.isActive {
    self.searchController.dismiss(animated: false) { 
        // Do what you want here like perform segue or present
    }
}

希望这会有所帮助!

ltqd579y

ltqd579y3#

我在点击搜索结果时尝试执行segue时遇到了同样的错误。这不是一个理想的解决方案,但在执行segue之前关闭searchController为我解决了这个问题:

self.searchController.dismiss(animated: false) { 
        self.performSegue(withIdentifier: "<YOUR SEGUE IDENTIFIER>", sender: cell)
    }
0mkxixxg

0mkxixxg4#

我不确定上述答案在以前的版本中是否正常工作,但在swift 5中,调用dislose将导致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)

}
qmb5sa22

qmb5sa225#

解除UISearchController(在本主题中以十几种不同的方式提出)是一个可行的解决方案。

definesPresentationContext = true

在具有UISearchController的视图控制器的 viewDidLoad() 中。此变通方法的优点在于,当您向后导航时,UISearchController仍显示搜索结果。

zmeyuzjn

zmeyuzjn6#

没有代码是很难帮助你的。这个错误可能是因为你破坏了视图控制器的层次结构而发生的。
该消息指出您有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)

请记住,视图控制器一次只能显示一个视图控制器,但它可以有多个子视图控制器(如导航控制器)。
有关详细信息,请查看:https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/TheViewControllerHierarchy.html#//apple_ref/doc/uid/TP40007457-CH33-SW1
作为一个注解,以大写字母(“ProfileView”而不是“profileView ")作为类名的开头是一个很好的编码习惯。

相关问题