Attention: Tenter de présenter * sur * qui est déjà présent (null)

Ceci est ma première application pour iOS.

J'ai donc un UIVIewController avec un UITableView où j'ai embedded un UISearchBar et un UISearchController afin de filterr les TableCells à afficher

 override func viewDidLoad() { menuBar.delegate = self table.dataSource = self table.delegate = self let nib = UINib(nibName: "ItemCellTableViewCell", bundle: nil) table.registerNib(nib, forCellReuseIdentifier: "Cell") let searchButton = UIBarButtonItem(barButtonSystemItem: .Search, target: self, action: "search:") menuBar.topItem?.leftBarButtonItem = searchButton self.resultSearchController = ({ let controller = UISearchController(searchResultsController: nil) controller.searchResultsUpdater = self controller.dimsBackgroundDuringPresentation = false return controller })() self.table.reloadData() } 

J'utilise aussi un segue modal pour ouvrir le ViewController l'élément où je vais afficher les détails de l'élément.

 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { self.index = indexPath.row self.performSegueWithIdentifier("ItemDetailFromHome", sender: self) } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if (segue.identifier == "ItemDetailFromHome") { let settingsVC = segue.destinationViewController as! ItemDetailViewController settingsVC.parent = self if self.isSearching == true && self.searchText != nil && self.searchText != "" { settingsVC.item = self.filteredItems[self.index!] } else { settingsVC.item = self.items[self.index!] } } } 

Cela fonctionne bien jusqu'à ce que j'essaie d'afficher le ItemDetailViewController pour un élément filtré (via UISearchController ).

J'ai le message suivant:

 Warning: Attempt to present <ItemDetailViewController: *> on <HomeViewController: *> which is already presenting (null) 

À chaque fois que je vais à la fonction ItemDetailViewController.viewDidLoad() mais après que lorsque la search est activée, j'ai l'erreur précédente.

Une idée ? J'ai essayé d'utiliser l'envoi asynchronous suivant mais sans succès

 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { self.index = indexPath.row dispatch_async(dispatch_get_main_queue(), { () -> Void in self.performSegueWithIdentifier("ItemDetailFromHome", sender: self) }) } 

J'ai trouvé une solution.

J'ai ajouté le code suivant dans HomeViewController.viewDidLoad et cela fonctionne!

 definesPresentationContext = true 

Dans mon cas, j'ai trouvé mon code pour présenter le nouveau viewController (un UIAlertController ) qui était appelé deux fois.

Vérifiez cela avant de discuter avec definesPresentationContext .

J'ai fait face au même genre de problème Ce que j'ai fait est d'Interface builder sélectionné ma segue Son genre était "Present Modally" et sa présentation était "Over current context"

J'ai changé la présentation à "Default", et puis cela a fonctionné pour moi.

C'est arrivé avec moi sur notre projet. Je présentais notre log in / log ViewController comme un pop-over. Mais chaque fois que j'ai essayé de me déconnecter à nouveau et d'afficher à nouveau le pop-over, je le faisais déconnecter dans ma console:

Warning: Attempt to present UIViewController on <MY_HOME_VIEW_CONTROLLER> which is already presenting (null)

Ma conjecture est que le pop-over était toujours tenu par mon ViewController même s'il n'était pas visible.

Cependant, vous essayez d'afficher le nouveau ViewController , le code suivant que j'ai utilisé pour résoudre le problème devrait fonctionner pour vous:

 func showLoginForm() { // Dismiss the Old if let presented = self.presentedViewController { presented.removeFromParentViewController() } // Present the New let storyboard = UIStoryboard(name: "MPTLogin", bundle: Bundle(for: MPTLogin.self)) let loginVC = storyboard.instantiateViewController(withIdentifier: "LogInViewController") as? MPTLogInViewController let loginNav = MPTLoginNav(rootViewController: loginVC!) loginNav.modalPresentationStyle = .pageSheet; self.present(loginNav, animated: true, completion: nil) }