tab icon bar swift uitabbarcontroller uitabbar

swift - icon - Detectar cuando se presiona un elemento de la barra de pestañas



uitabbarcontroller programmatically swift (3)

Aquí hay una versión de la respuesta de @mbeaty con un poco más de contexto. Se adapta de mi respuesta más completa aquí .

import UIKit class MyTabBarController: UITabBarController, UITabBarControllerDelegate { override func viewDidLoad() { super.viewDidLoad() // tell our UITabBarController subclass to handle its own delegate methods self.delegate = self } // called whenever a tab button is tapped func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { if let firstVC = viewController as? FirstViewController { firstVC.doSomeAction() } if viewController is FirstViewController { print("First tab") } else if viewController is SecondViewController { print("Second tab") } } // alternate method if you need the tab bar item override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) { // ... } }

Establézcalo como la clase personalizada de su controlador de vista de pestaña en IB.

Solución alternativa

  • Simplemente haga algo en el método viewDidLoad del controlador de vista de la pestaña. Ver esta respuesta

Tengo un controlador de vista raíz que no está configurado como la clase personalizada para ninguno de mis controladores de vista en mi guión gráfico. En su lugar, todos mis controladores de vista están subclasificando esta clase como tal.

// RootViewController class RootViewController: UIViewController, UITabBarDelegate { // This is not getting executed on any of the view controllers func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) { print("ddd") } } // Subclassing it class TopStoriesViewController: RootViewController { }

Pero parece que estoy luchando para hacer algo cuando se presiona un tabbaritem en el controlador de vista que está subclasificando el controlador de vista de raíz, es decir, el mensaje no se está imprimiendo.


Hacerlo de esta manera me causó un error.

No se permite cambiar el delegado de una barra de pestañas administrada por un controlador de la barra de pestañas

Esto es lo que hice y funcionó.

  1. En su ViewController usted hereda UITabBarControllerDelegate
  2. Establecer delegado en un viewDidLoad
  3. Añadir una función

Ejemplo:

class MyClass: UIViewController, UITabBarControllerDelegate { func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { let tabBarIndex = tabBarController.selectedIndex if tabBarIndex == 0 { //do your stuff } } override func viewDidLoad() { super.viewDidLoad() self.tabBarController?.delegate = self } }


No desea que la clase base de su controlador de vista sea un UITabBarDelegate. Si tuviera que hacer eso, todas las subclases de sus controladores de vista serían delegados de la barra de pestañas. Lo que creo que quieres hacer es extender UITabBarController, algo como esto:

class MyTabBarController: UITabBarController, UITabBarControllerDelegate {

luego, en esa clase, anule viewDidLoad y en allí establezca la propiedad delegada en self:

self.delegate = self

Nota: Esto es establecer el delegado del controlador de la barra de pestañas. La barra de pestañas tiene su propio delegado (UITabBarDelegate), que administra el controlador de la barra de pestañas, y no se le permite cambiar.

Entonces, ahora esta clase es tanto una UITabBarDelegate (porque UITabBarController implementa ese protocolo), como UITabBarControllerDelegate, y puede anular / implementar los métodos de los delegados como desee, como por ejemplo:

// UITabBarDelegate override func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) { print("Selected item") } // UITabBarControllerDelegate func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) { print("Selected view controller") }

Supongo que probablemente estés más interesado en lo último. Revise la documentación para ver lo que ofrece cada uno de estos delegados.

Lo último, en tu guión gráfico (suponiendo que estés usando guiones gráficos), configura la clase del controlador de la barra de pestañas como MyTabBarController en el inspector de identidad, y listo.

Swift 3/4

// UITabBarDelegate override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) { print("Selected item") } // UITabBarControllerDelegate func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { print("Selected view controller") }