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ó.
- En su
ViewController
usted heredaUITabBarControllerDelegate
- Establecer delegado en un
viewDidLoad
- 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")
}