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