PersonViewController en TabBarController

Tengo un UITabBarController con tres tabs. Cuando se presiona una determinada, me gustaría que el usuario vea inmediatamente un controller de vista de persona (una instancia de la class ABPersonViewController ).

No quiero usar simplemente el método presentViewController() con un controller de vista de persona como parámetro, ya que esto resulta en un retraso cuando el usuario puede ver el controller de vista subyacente desde donde se presenta.

Tampoco puedo hacer que el controller de vista sea henetworkingado de ABPersonViewController , ya que Apple lo establece para que no pueda subclass. ¿Hay alguna forma en que pueda lograr esto?

Gracias a la respuesta de JAL:

 func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool { let navViewController = viewController as! UINavigationController // First, check to see if the view controller is the one you want to override if let myViewController = navViewController.viewControllers[0] as? ThirdViewController { let abpvc = ABPersonViewController() abpvc.personViewDelegate = self self.navigationController?.pushViewController(abpvc, animated: true) return false } return true } 

Utilice el método shouldSelectViewController :

 func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool { // First, check to see if the view controller is the one you want to override if let myViewController = viewController as? ViewControllerToOverride { // do something here, present a new view controller, etc. return false // then return false to prevent the tab from switching } 

Para seleccionar el elemento de la barra de tabs (si está utilizando una image), cambie la image de UITabBarItem o UITabBarItem selectedImage . Debido a que devuelve falso cuando selecciona la pestaña, probablemente necesite cambiar la propiedad de la image lugar de la image selectedImage .

 self.tabBar.items?.first?.image = UIImage(...) 

Responder

La idea esencial es subclass UITabBarController y ponga un button UIB en la barra de tabs, cubra el área de la pestaña original y agregue una acción a ese button, lo que activará las llamadas de function relevantes.

Para que el evento tap nunca se pase al tabBarController, sino solo al button. Para que el usuario nunca "vea el controller de vista subyacente".

Código de muestra

Código Sample Swift 1.2 que agrega un button al centro de UITabBarController

 func AddSampleButton(){ let SampleButton = UIButton() SampleButton.setTranslatesAutoresizingMaskIntoConstraints(false) SampleButton.setBackgroundImage(addImage, forState: UIControlState.Normal) SampleButton.addConstraint(NSLayoutConstraint(item: addButton, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: self.view.frame.size.width/5)) SampleButton.addConstraint(NSLayoutConstraint(item: addButton, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 50)) self.view.addSubview(addButton) self.view.addConstraint(NSLayoutConstraint(item: self.view, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: addButton, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0)) self.view.addConstraint(NSLayoutConstraint(item: self.view, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: addButton, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 0)) SampleButton.enabled = true SampleButton.addTarget(self, action: "SampleAction", forControlEvents: UIControlEvents.TouchUpInside) } func SampleAction() { let abpvc = ABPersonViewController() abpvc.personViewDelegate = self self.navigationController?.pushViewController(abpvc, animated: true) } 

Referencia :

http://idevrecipes.com/2010/12/16/raised-center-tab-bar-button/

darse count

Si no ve el button, tenga en count el ciclo de vida de UIViewContoller, porque tal vez sea el origen de su error.