storyboards que from example ios swift cocoa-touch uitabbarcontroller uistoryboard

ios - que - uitabbarcontroller programmatically swift



¿Cómo abrir un modal con UITabBarController y en cerrar, mostrar la última barra de pestañas vista? (4)

Así que tengo un UITabBarController en un storyboard que tiene 3 botones. Dos de ellos abren vistas estándar asociadas con la barra de pestañas según la asociación de vista estándar segues ... el tercer elemento es el problema.

Me gustaría abrir un formulario que vive en otro guión gráfico (compartido por otras vistas en la aplicación) en una vista modal, y al cerrar o enviar, simplemente regrese a la pestaña que estaba previamente activa en la vista con pestañas.

He visto algunas "opciones" por ahí, pero ninguna de ellas parece ser exactamente lo que estoy buscando hacer.

¿Algunas ideas?

EDIT: Fue editado de mi pregunta original por un mod, pero estoy escribiendo esto en Swift ... no Obj-C.


Así que tengo una solución potencial que funciona con un controlador de vista en blanco, debería SelecccionarControllador y el Delegado del Contralor de UIT. El único problema es que no estoy especialmente contento con lo frágil que es.

func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool { // This is a bit dangerous if we move where ''newController'' is located in the tabs, this will break. let newController = viewControllers![1] as! UIViewController // Check if the view about to load is the second tab and if it is, load the modal form instead. if viewController == newController { let storyboard = UIStoryboard(name: "ModalController", bundle: nil) let vc = storyboard.instantiateInitialViewController() as? UIViewController presentViewController(vc!, animated: true, completion: nil) return false } else { return true } }

Esto funciona bien, pero si alguien viniera y reorganizara el orden de las pestañas en el guión gráfico, esto se rompería.

También para darle a @rmp un poco de crédito, otra opción es "Si usted proporciona un título para todos sus controles de visualización raíz que conforman las pestañas en su tabBarController, puede usar viewController.title para verificar qué pestaña se pulsó en el delegado shouldSelectViewController. Por supuesto, todavía corre el riesgo de que alguien cambie el nombre de su propiedad de título de vista ".



Para responder a su segunda pregunta acerca de que es "frágil"

Si proporciona un título para todos los controladores de visualización raíz que conforman las pestañas en su tabBarController , puede usar viewController.title para verificar qué pestaña se pulsó en el delegado shouldSelectViewController . Por supuesto, aún corre el riesgo de que alguien cambie el nombre de la propiedad de título de sus vistas.


Parece que realmente no quieres una pestaña, las pestañas deben contener una vista y no presentar una vista nueva / modal. Sin embargo, hay casos en los que lo que quieres hacer tiene sentido, como algunas aplicaciones usarán la pestaña central como un botón para agregar un nuevo elemento o realizar algunas acciones (Yelp es un buen ejemplo). En estos casos, la pestaña suele ser más grande o visualmente diferente para indicar que no es realmente una pestaña. Esto es lo que creo que realmente estás buscando.

Para hacer esto necesitas:

  1. Crea una pestaña en la tabBar esto solo será un tabBar posición.
  2. Cree un icono o imagen que se usará como botón que pasará por la pestaña del marcador de posición
  3. Utilice el viewWillLayoutSubviews de su clase tabBarController para colocar el botón sobre la pestaña del marcador de posición. Ver abajo (código de ejemplo de retrato).
  4. Agrega una acción al botón que presentará tu vista modal.

Nota: es posible que deba ajustar la ubicación del botón utilizando el código a continuación para satisfacer sus necesidades.

-(void)viewWillLayoutSubviews{ [super viewWillLayoutSubviews]; if (UIDeviceOrientationIsPortrait && !centerTabButton) { //CUSTOM CENTER TAB BAR BUTTON UIImage *buttonImage = [UIImage imageNamed:@"icn_CenterTabBarIcon.png"]; UIImage *highlightImage = [UIImage imageNamed:@"icn_CenterTabBarIcon.png"]; centerTabButton = [UIButton buttonWithType:UIButtonTypeCustom]; centerTabButton.frame = CGRectMake(0.0, 0.0, buttonImage.size.width, buttonImage.size.height); [centerTabButton setBackgroundImage:buttonImage forState:UIControlStateNormal]; [centerTabButton setBackgroundImage:highlightImage forState:UIControlStateHighlighted]; [centerTabButton setShowsTouchWhenHighlighted:FALSE]; [centerTabButton setAdjustsImageWhenHighlighted:FALSE]; [centerTabButton addTarget:self action:@selector(centerTabClicked:) forControlEvents:UIControlEventTouchUpInside]; CGFloat heightDifference = buttonImage.size.height - self.tabBar.frame.size.height; //center the button on the tab bar based on the tab bar''s height if (heightDifference < 0){ centerTabButton.center = self.tabBar.center; } else{ CGPoint center = self.tabBar.center; center.y = center.y - heightDifference/2.0; centerTabButton.center = center; } [self.view addSubview:centerTabButton]; } }