iOS UISearchController崩溃:应用程序试图在其自身上呈现模态视图控制器

时间:2017-10-24 18:47:53

标签: ios objective-c uisearchcontroller

据崩溃论说,发生了以下崩溃(很少)。

  

应用程序试图在自身上呈现模态视图控制器。   呈现控制器是。

我根本无法复制这个问题。这就是我设置UISearch控制器的方法。

    self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
    self.searchController.dimsBackgroundDuringPresentation = NO;
    self.searchController.searchBar.delegate = self;

    self.tableView.tableHeaderView = self.searchController.searchBar;
    self.definesPresentationContext = YES;

任何帮助都表示赞赏,因为我完全没有想法。如果需要,我会发布更多代码。

3 个答案:

答案 0 :(得分:16)

当我更新到iOS 11时,我遇到了这个问题。 我的情况是,我有一个Textfield,当用户开始编辑它时,一个搜索视图,基本上是一个带有搜索栏作为标题的tableview弹出,一旦一个tableview单元被点击,它应该关闭。

问题似乎是从iOS 11开始,操作系统尝试恢复firstResponder状态。长话短说。

当我添加active = NO时,它有助于我的选择方法,就像这样

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
   self.searchController.active = NO; // Add this !
   ...

   [self dismissViewControllerAnimated:YES completion:nil];
}

答案 1 :(得分:1)

如果您像我一样,并且需要在模态显示另一个控制器时使searchController保持 active ,那么请执行以下操作以获得模态显示的效果,而无需直接执行:

快速说明:对Obj-C不够熟悉,无法给出答案,但这是Swift 4中的答案。如果需要,可以随时编辑和添加Obj-C,但我认为这里很清楚如何解决问题就在眼前,即使是在Swift中也是如此。

假设我有一个要弹出的菜单:

let info = the info you need to pass
let currVC = self.getTopMostViewController()
let menuVC = currVC.storyboard?.instantiateViewController(withIdentifier: "myStringIdentifierSetInStoryboard") as? EventMenuViewController
guard menuVC != nil else { return }
menuVC!.info = info // Pass info necessary (i.e. what you would normally pass in prepare(for segue: ...). menuVC.info is a global variable from your class
currVC.present(menuVC!, animated: true, completion: nil)

getTopMostViewController()的实现可能有所不同。我的位于下方,改编自here

func getTopMostViewController() -> UIViewController {
    let anyVC = UIViewController()
    if var topController = UIApplication.shared.keyWindow?.rootViewController {
        while let presentedViewController = topController.presentedViewController {
            topController = presentedViewController
        }
        return topController
    }
    return anyVC
}

希望这会有所帮助!这并没有给您提供针对iOS 12和Swift 4所描述的错误,尽管在尝试使用活动搜索控制器进行模态展示时确实出现了确切的错误,这就是导致我出现的原因。

答案 2 :(得分:0)

确保您使用

self.searchController = UISearchController()

代替

self.searchController = UISearchController(searchResultsController: self)