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