Cambio programático entre pestañas dentro de Swift


80

Necesito escribir un código para cambiar la vista a otra pestaña cuando se inicia la aplicación de iOS (por ejemplo, la segunda pestaña se muestra de forma predeterminada en lugar de la primera).

Soy nuevo en Swift y he trabajado en lo siguiente:

  • El código probablemente debería ir en la función override func viewDidLoad () del ViewController de la primera pestaña.

  • El siguiente código muestra el segundo ViewController, pero no con la barra de pestañas en la parte inferior (vcOptions es el segundo elemento de la pestaña ViewController:

let vc : AnyObject! = self.storyboard.instantiateViewControllerWithIdentifier("vcOptions")
self.showViewController(vc as UIViewController, sender: vc)

Creo que la respuesta puede estar en usar UITabbarController.selectedIndex = 1, pero no estoy seguro de cómo implementar esto.

Respuestas:


139

Si su window rootViewControlleres UITabbarController(que es en la mayoría de los casos), entonces puede acceder tabbaren didFinishLaunchingWithOptionsel AppDelegatearchivo.

func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {
    // Override point for customization after application launch.

    if let tabBarController = self.window!.rootViewController as? UITabBarController {
        tabBarController.selectedIndex = 1
    }

    return true
}

Esto abrirá la pestaña con el index(1) en selectedIndex.

Si hace esto en viewDidLoadsu firstViewController, debe administrar por bandera u otra forma de realizar un seguimiento de la pestaña seleccionada. El mejor lugar para hacer esto en didFinishLaunchingWithOptionssu AppDelegatearchivo o rootViewControllerclase personalizada viewDidLoad.


¡Tx por señalarme! Sin embargo, terminé con: if let tababarController = self.window!.rootViewController as! UITabBarController? { tababarController.selectedIndex = tabIndex }
Marcin Świerczyński

no puede hacer lo siguiente en su TabBarViewController: class TabBarViewController: UITabBarController { override func viewDidLoad() { super.viewDidLoad() selectedIndex = 1 }En este caso, solo va a seleccionar la pestaña secundaria que es lo que quiere hacer el OP.
Korpel

Simplemente reemplácelo as UITabBarControllercon as! UITabBarControllery también funciona en Swift 3. ¡Gracias por la respuesta!
Mamta

31

1. Cree una nueva clase que sustituya a UITabBarController. P.ej:

class xxx: UITabBarController {
override func viewDidLoad() {
        super.viewDidLoad()
}

2.Agregue el siguiente código a la función viewDidLoad ():

self.selectedIndex = 1; //set the tab index you want to show here, start from 0

3.Vaya al guión gráfico y configure la clase personalizada de su controlador de barra de pestañas en esta nueva clase. (MyVotes1 como ejemplo en la foto)

ingrese la descripción de la imagen aquí


Esto funcionó para mí en Xcode 8.2 swift 3. ¡Gracias! Mi aplicación mostrará la pestaña central (tercera) de 5 pestañas. class PatientTabBarController: UITabBarController {override func viewDidLoad () {super.viewDidLoad () selectedIndex = 2}}
Brian

28

Swift 3

Puede agregar este código al controlador de vista predeterminado ( index 0) en su tabBarController:

    override func viewWillAppear(_ animated: Bool) {
        _ = self.tabBarController?.selectedIndex = 1
    }

Tras la carga, esto movería automáticamente la pestaña al segundo elemento de la lista, pero también permitiría al usuario volver manualmente a esa vista en cualquier momento.


3
¿Por qué no utilizar "tabBarController? .SelectedIndex = 1" en su lugar?
Ahmadreza

Siempre deberías llamar super.viewWillAppear(). Además, la asignación a _ = es innecesaria.
Koen.

20

ViewController debe ser un elemento secundario de UITabBarControllerDelegate . Entonces solo necesita agregar el siguiente código en SWIFT 3

self.tabBarController?.selectedIndex = 1

18

Para expandir la respuesta de @ codester, no necesita verificar y luego asignar, puede hacerlo en un solo paso:

func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {
    // Override point for customization after application launch.

    if let tabBarController = self.window!.rootViewController as? UITabBarController {
        tabBarController.selectedIndex = 1
    }

    return true
}

5

En una aplicación típica hay un UITabBarController e incrusta 3 o más UIViewController como sus pestañas. En tal caso, si subclasificó un UITabBarController como YourTabBarController, entonces puede establecer el índice seleccionado simplemente por:

selectedIndex = 1 // Displays 2nd tab. The index starts from 0.

En caso de que esté navegando a YourTabBarController desde cualquier otra vista, entonces en el método prepare (para segue :) del controlador de esa vista puede hacer:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
        if segue.identifier == "SegueToYourTabBarController" {
            if let destVC = segue.destination as? YourTabBarController {
                destVC.selectedIndex = 0
            }
        }

Estoy usando esta forma de configurar la pestaña con Xcode 10 y Swift 4.2.


4

Rápido 5

//MARK:- if you are in UITabBarController 
self.selectedIndex = 1

o

tabBarController?.selectedIndex = 1

2

Solo para actualizar, después de iOS 13, ahora tenemos SceneDelegates. Por lo tanto, uno podría optar por colocar la selección de pestaña deseada en SceneDelegate.swift de la siguiente manera:

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene, 
               willConnectTo session: UISceneSession, 
               options connectionOptions: UIScene.ConnectionOptions) {

        guard let _ = (scene as? UIWindowScene) else { return }

        if let tabBarController = self.window!.rootViewController as? UITabBarController {
            tabBarController.selectedIndex = 1
        }

    }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.