Programmgesteuertes Wechseln zwischen Registerkarten in Swift

79

Ich muss Code schreiben, um die Ansicht beim Starten der iOS-App auf eine andere Registerkarte umzuschalten (so wird beispielsweise die zweite Registerkarte standardmäßig anstelle der ersten angezeigt).

Ich bin neu bei Swift und habe Folgendes herausgefunden:

  • Der Code sollte wahrscheinlich in der Funktion override func viewDidLoad () des ViewControllers der ersten Registerkarte enthalten sein.

  • Der folgende Code zeigt den zweiten ViewController, jedoch nicht die Registerkartenleiste unten (vcOptions ist das zweite ViewController-Registerkartenelement:

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

Ich denke, die Antwort könnte in der Verwendung von UITabbarController.selectedIndex = 1 liegen, aber nicht ganz sicher, wie dies implementiert werden soll.

Oliver Spencer
quelle

Antworten:

136

Wenn Sie window rootViewControllerist UITabbarController(was in den meisten Fällen) , dann können Sie Zugriff tabbarin didFinishLaunchingWithOptionsder AppDelegateDatei.

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
}

Dies öffnet die Registerkarte mit dem indexangegebenen (1) in selectedIndex.

Wenn Sie dies in viewDidLoadIhrem tun firstViewController, müssen Sie nach Flag oder auf andere Weise verwalten, um den Überblick über die ausgewählte Registerkarte zu behalten. Der beste Ort, um dies in didFinishLaunchingWithOptionsIhrer AppDelegateDatei oder rootViewControllerbenutzerdefinierten Klasse zu tun viewDidLoad.

Codester
quelle
Tx für den Hinweis! Am Ende hatte ich jedoch: if let tababarController = self.window!.rootViewController as! UITabBarController? { tababarController.selectedIndex = tabIndex }
Marcin Świerczyński
Können Sie in Ihrem Fall nicht Folgendes tun TabBarViewController: class TabBarViewController: UITabBarController { override func viewDidLoad() { super.viewDidLoad() selectedIndex = 1 }In diesem Fall wird nur die sekundäre Registerkarte ausgewählt, die das OP ausführen möchte.
Korpel
Ersetzen Sie einfach as UITabBarControllermit as! UITabBarControllerund es funktioniert in Swift 3 auch .. Danke für die Antwort!
Mamta
31

1.Erstellen Sie eine neue Klasse, die UITabBarController ersetzt. Z.B:

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

2. Fügen Sie der Funktion viewDidLoad () den folgenden Code hinzu:

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

3. Gehen Sie zum Storyboard und setzen Sie die benutzerdefinierte Klasse Ihres Tab Bar Controllers auf diese neue Klasse. (MyVotes1 als Beispiel im Bild)

Geben Sie hier die Bildbeschreibung ein

WTIFS
quelle
Dies funktionierte für mich in Xcode 8.2 Swift 3. Danke! Meine App zeigt die mittlere (3.) Registerkarte von 5 Registerkarten. Klasse PatientTabBarController: UITabBarController {überschreiben func viewDidLoad () {super.viewDidLoad () selectedIndex = 2}}
Brian
28

Swift 3

Sie können diesen Code zum Standard-View-Controller ( index 0) in Ihrem tabBarController hinzufügen:

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

Beim Laden wird die Registerkarte automatisch zum zweiten Element in der Liste verschoben, der Benutzer kann jedoch jederzeit manuell zu dieser Ansicht zurückkehren.

Ponyboy
quelle
3
Warum nicht stattdessen "tabBarController? .SelectedIndex = 1" verwenden?
Ahmadreza
Sie sollten immer anrufen super.viewWillAppear(). Auch die Zuordnung zu _ = ist nicht erforderlich.
Koen.
20

Der viewController muss ein untergeordnetes Element von UITabBarControllerDelegate sein . Sie müssen also nur den folgenden Code in SWIFT 3 hinzufügen

self.tabBarController?.selectedIndex = 1
Leo Paim
quelle
18

Um die Antwort von @ codester zu erweitern, müssen Sie sie nicht überprüfen und dann zuweisen. Sie können dies in einem Schritt tun:

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
}
Anorak
quelle
5

In einer typischen Anwendung gibt es einen UITabBarController, in den drei oder mehr UIViewController als Registerkarten eingebettet sind. In einem solchen Fall können Sie den ausgewählten Index einfach festlegen, indem Sie einen UITabBarController als YourTabBarController klassifizieren:

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

Wenn Sie von einer anderen Ansicht aus zu YourTabBarController navigieren, können Sie in dieser Ansicht die Methode vorbereiten (für segue :) vorbereiten:

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
            }
        }

Ich verwende diese Art der Einstellung der Registerkarte mit Xcode 10 und Swift 4.2.

Pankaj Kulkarni
quelle
3

Swift 5

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

oder

tabBarController?.selectedIndex = 1
Shakeel Ahmed
quelle
2

Nur um nach iOS 13 zu aktualisieren, haben wir jetzt SceneDelegates. Sie können also die gewünschte Registerkartenauswahl wie folgt in SceneDelegate.swift einfügen:

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
        }

    }
Rob D.
quelle