ios swift uitableview uiviewcontroller uistoryboardsegue

ios - Advertencia: intento de presentar*en*que ya está presentando(nulo)



swift uitableview (6)

Esta es mi primera aplicación para iOS.

Así que tengo un UIVIewController con una UITableView donde he integrado un UISearchBar y un UISearchController para filtrar TableCells para mostrar

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

También estoy usando un segue modal para abrir el ViewController del elemento donde ViewController detalles del elemento.

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!] } } }

Eso funciona bien hasta que intento mostrar ItemDetailViewController para un elemento filtrado (a través del UISearchController ).

Tengo el siguiente mensaje:

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

En cada momento voy a la función ItemDetailViewController.viewDidLoad() pero después de eso cuando la búsqueda está activada, tengo el error anterior.

Alguna idea ? Intenté utilizar el siguiente envío asincrónico pero sin éxito

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


En mi caso, encontré mi código para presentar el nuevo viewController (un UIAlertController ) que se llamaba dos veces.

Verifique esto antes de jugar con definesPresentationContext .


En mi caso, estaba tratando de presentar un UIAlertController en algún momento de la vida de la aplicación después de usar un UISearchController en el mismo UINavigationController .

No estaba usando UISearchController correctamente y olvidé establecer searchController.isActive = false antes de descartar. Más adelante en la aplicación traté de presentar la alerta, pero el controlador de búsqueda, aunque no estaba visible en ese momento, todavía controlaba el contexto de la presentación.


Enfrenté el mismo tipo de problema. Lo que hice fue de Interface Builder seleccionado mi segue. Su tipo fue "Present Modally" y su presentación fue "Over current context".

Cambié la presentación a "Predeterminado", y luego funcionó para mí.


Esto es lo que finalmente funcionó para mí, ya que mi proyecto no tenía exactamente un NavigationVC sino, en cambio, un VC independiente. como archivos xib

Este código produjo el error:

present(alertVC, animated: true, completion: nil)

Este código corrigió el error:

if presentedViewController == nil{ navigationController?.present(alertVC, animated: true, completion: nil) }


Esto sucedió conmigo en nuestro proyecto. Estaba presentando nuestro inicio / ViewController sesión de ViewController como un pop-over. Pero cada vez que traté de volver a iniciar sesión y mostrar el pop-over nuevamente, estaba cerrando sesión en mi consola:

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

ViewController mi ViewController aún mantenía el pop-over aunque no estaba visible.

Sin embargo, si intenta mostrar el nuevo ViewController , el siguiente código que utilicé para resolver el problema debería funcionar para usted:

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


He encontrado una solución.

¡He añadido el siguiente código en HomeViewController.viewDidLoad y eso funciona!

definesPresentationContext = true