que objective hig framework ios objective-c iphone uikit

ios - objective - Pantalla negra después de presentar el controlador de vista modal en el contexto actual de UITabBarController



swift ios documentation (8)

Mi controlador de vista raíz es un UITabBarController. Intento presentar un controlador de vista modal sobre uno de los controladores de vista del controlador de la barra de pestañas, pero aún así permitir que la barra de pestañas se use para ir a una pestaña diferente; en otras palabras, me gustaría que el modal solo interrumpa a el flujo de esa pestaña en particular, no toda la aplicación.

Para hacer esto, configuré el estilo de presentación del controlador de visualización de presentación como ''Contexto sobre corriente'' en el guión gráfico. El problema que tengo es que después de presentar el controlador de vista modal y seleccionar una nueva pestaña, la vista del controlador de la vista que se presenta se elimina de la ventana y no se vuelve a agregar a la ventana cuando se descarta el controlador de vista presentado. Después de descartar el controlador de vista, mover a otra pestaña y luego regresar vuelve a colocar el controlador de vista de presentación en la ventana.

He reproducido mi problema usando la plantilla ''Tabbed'' en Xcode.

Después de presentar modal: agregué transparencia al controlador de vista presentado para ver fácilmente lo que está sucediendo en el controlador de vista presentado.

Cambiando a la segunda pestaña y luego a la anterior: la vista del controlador de la vista de presentación ahora se ha eliminado.

Descartar el modal deja al controlador de vista de presentación con su vista aún eliminada de la ventana. Ir a la pestaña 2 y regresar agrega la vista a la ventana.

Espero que esto sea algo simple que he pasado por alto en el guión gráfico, pero el hecho de que puedo presentar el modal y ver el controlador de vista presentado detrás de él antes de cambiar las pestañas me hace pensar que tengo las cosas configuradas correctamente.


Al tener un problema similar con mi controlador de pestañas, sin embargo, al igual que los comentarios, sugiero cambiar el segue a un push o un show segue. Esto permitirá que esa pestaña permanezca intacta con la nueva vista que se muestra en lugar de la vista anterior cuando se cambia a otras pestañas. Si la estética es un problema, puede crear un controlador de navegación personalizado para personalizar la apariencia de la nueva vista.


Intente configurar su estilo de presentación como ''Sobre pantalla completa'' en lugar de ''Sobre contexto actual'' en el guión gráfico.


Intente presentar el controlador de vista en la ventana de la aplicación. Tuve un problema similar que fue corregido por el siguiente código:

let myNewVC = mainStoryBoard.instantiateViewController(withIdentifier: "MyNewVCId") as! MyNewVC let navController = UINavigationController(rootViewController: myNewVC) navController.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext let appDelegate = UIApplication.shared.delegate as? AppDelegate appDelegate?.window?.rootViewController?.present(navController, animated: true, completion: nil)

Espero que esto le ayude también.


Reproduje tu problema y encontré una solución. No implica cambiar el método segue o cambiar algunos atributos en el guión gráfico.

Sugerencia:

Pero antes de ir a la solución, me gustaría añadir que el objetivo de los controladores de vista presentados de forma modal es distribuir el flujo real de la aplicación y presentar información contextual adicional o algunos contenidos accionables para la presentación de vc. En pocas palabras, es muy lógico y, de hecho, se recomienda cubrir la barra de pestañas cuando se presenta un controlador de vista de forma modal. Hay muchos buenos ejemplos de esto en la tienda de aplicaciones.

Dicho esto, aquí hay una solución que propongo.

Solución:

Creo que el problema radica en la forma en que UITabBarController maneja su jerarquía de vistas. Lo que hice fue descartar explícitamente el controlador de vista presentado de manera modal antes de que se cambiara la pestaña. Esto hizo que el controlador de vista de presentación persistiera en la jerarquía de vistas del UITabBarViewController antes de que la barra de pestañas cambie a una nueva pestaña.

En el método "viewWillDisappear" de su ViewController presentado modalmente, agregue esto.

- (void)viewWillDisappear:(BOOL)animated { [self dismissViewControllerAnimated:true completion:^{ [super viewWillDisappear:animated]; }]; }


Tengo el mismo problema en el proyecto actual en vivo. He hecho una solución a eso.

Finalmente, he usado NSNotificationCenter y NSNotificationCenter ese controlador de vista cuando se cambia la pestaña para resolver este problema.

Hice referencia al controlador tabbar en AppDelegate y establecí el delegado allí.

let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil) let tabbarcontroller = storyboard.instantiateViewControllerWithIdentifier("MyTabBarController") as! UITabBarController tabbarcontroller.delegate = self

Y es delegado como

//MARK: - Tabbar controller delegate extension AppDelegate : UITabBarControllerDelegate { func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) { NSNotificationCenter.defaultCenter().postNotificationName("TabBarTabChanged", object: nil) } }

Luego tengo agregar observador en mi controlador de vista presentado como

override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(PreviewPlaceVC.BackClickAction(_:)), name: "TabBarTabChanged", object: nil) } // MARK: - Button Click Actions @IBAction func BackClickAction(sender: AnyObject) { self.dismissViewControllerAnimated(true, completion: nil) }

Y está bien para mi. No es una solución adecuada, creo que para descartar ver el controlador en el evento de cambio de pestaña, pero está bien descartar en lugar de la pantalla en negro, que también rompe la navegación ese momento.


Tuve el mismo problema y pude resolverlo estableciendo self.definesPresentationContext = YES; en el controlador de vista de presentación antes de presentar el VC modal. También puede establecer esto en un guión gráfico, la casilla de verificación se llama "Define Context" en el Interface Builder.


tuve este problema: cuando presento mi ModalController toma un fondo transparente y cuando cambié la pestaña a la siguiente en tabBarController y getBack a la anterior el fondo transparente desapareció y hay un fondo negro oscuro después de la investigación encontré el punto punto es esto:

self.definesPresentationContext = true

el yo no es el controlador modal auto es aquel que presenta el controlador para modalController y otro punto es .overCurrentContext como este

** self.definesPresentationContext = true ** modalController.modalPresentationStyle = .overCurrentContext self.present(modalController, animated: true, completion: nil)


iOS 10+ y Swift 3+

Tengo una muy buena solución a este problema. Se está presentando el uso, a través del estilo de presentación modal de pantalla completa para un controlador de vista.

let storyboard = UIStoryboard(name: "Main", bundle: nil) // Replace “Main” with your storyboard name if let viewController = storyboard?.instantiateViewController(withIdentifier: “viewController Identifier”) as? ViewController { viewController.modalPresentationStyle = .overFullScreen self.present(viewController, animated: false, completion: { }) }

Sobre la pantalla completa presentará su controlador de vista sobre su barra de pestañas (controlador) cubriéndolo. Por lo tanto, el usuario final no puede cambiar tabbar (a menos que realice operaciones de forma programática) elementos de la barra de pestañas. El usuario debe cerrar este controlador de vista para cambiar tabbar.

Si está utilizando segue, para presentar el controlador de vista, seleccione ''Sobre pantalla completa'' desde el estilo de presentación modal en la inspección de atributos