Програмне перемикання між вкладками в Swift


83

Мені потрібно написати трохи коду, щоб перемкнути перегляд на іншу вкладку при запуску програми iOS (так, наприклад, друга вкладка відображається за замовчуванням, а не перша).

Я новачок у Swift і розробив наступне:

  • Можливо, код повинен переходити до функції перевизначення func viewDidLoad () функції ViewController першої вкладки.

  • Наступний код показує другий ViewController, але не з панеллю вкладок внизу (vcOptions - це другий елемент вкладки ViewController:

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

Я думаю, що відповідь може полягати у використанні UITabbarController.selectedIndex = 1, але не зовсім впевнений, як це реалізувати.

Відповіді:


142

Якщо ваш window rootViewControllerє UITabbarController(що в більшості випадків) , то ви можете отримати доступ tabbarв didFinishLaunchingWithOptionsв AppDelegateфайлі.

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
}

Це відкриє вкладку із indexзаданим (1) в selectedIndex.

Якщо ви робите це у viewDidLoadсвоєму firstViewController, вам потрібно керувати прапором або іншим способом, щоб відстежувати вибрану вкладку. Найкраще місце для цього у didFinishLaunchingWithOptionsвашому AppDelegateфайлі або rootViewControllerкористувацькому класі viewDidLoad.


Tx за вказівку мені! Однак я закінчив з: if let tababarController = self.window!.rootViewController as! UITabBarController? { tababarController.selectedIndex = tabIndex }
Марцином Свірчинським

Ви не можете зробити наступне у вашому TabBarViewController: class TabBarViewController: UITabBarController { override func viewDidLoad() { super.viewDidLoad() selectedIndex = 1 }У цьому випадку він просто збирається вибрати вторинну вкладку, що і хоче зробити OP.
Корпель

Просто замініть as UITabBarControllerна, as! UITabBarControllerі це працює і в Swift 3 .. Дякую за відповідь!
Mamta

31

1. Створіть новий клас, який перекриває UITabBarController. Наприклад:

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

2. Додайте такий код до функції viewDidLoad ():

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

3. Перейдіть до розкадровки та встановіть для власного класу вашого контролера панелі вкладок цей новий клас. (MyVotes1 як приклад на малюнку)

введіть тут опис зображення


Це спрацювало для мене в Xcode 8.2 swift 3. дякую! У моєму додатку відображатиметься середня (третя) вкладка з 5 вкладок. class PatientTabBarController: UITabBarController {override func viewDidLoad () {super.viewDidLoad () selectedIndex = 2}}
Брайан

28

Стрімкий 3

Ви можете додати цей код до контролера перегляду за замовчуванням ( index 0) у вашому tabBarController:

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

Після завантаження це автоматично переміщує вкладку до другого елементу у списку, але також дозволяє користувачеві вручну повернутися до цього подання в будь-який час.


3
Чому замість цього не використовується "tabBarController? .SelectedIndex = 1"?
Ахмадреза

Вам слід завжди телефонувати super.viewWillAppear(). Також призначення до _ = є непотрібним.
Коен.

20

ViewController має бути нащадком UITabBarControllerDelegate . Тож вам просто потрібно додати такий код на SWIFT 3

self.tabBarController?.selectedIndex = 1

18

Щоб розширити відповідь @ Codeter, вам не потрібно перевіряти, а потім призначати, ви можете зробити це одним кроком:

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

У типовому додатку є UITabBarController, і він вбудовує 3 або більше UIViewController як свої вкладки. У такому випадку, якщо ви підкласифікували UITabBarController як YourTabBarController, тоді ви можете встановити вибраний індекс просто:

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

Якщо ви переходите до YourTabBarController з будь-якого іншого подання, тоді в цьому поданні контролер підготується (до методу segue :), ви можете зробити:

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

Я використовую цей спосіб встановлення вкладки з Xcode 10 і Swift 4.2.



2

Просто для оновлення, після iOS 13, тепер у нас є SceneDelegates. Отже, можна вибрати бажаний вибір вкладки в SceneDelegate.swift наступним чином:

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
        }

    }

0

Якщо ви хочете зробити це з коду, який ви пишете як частину певного контролера перегляду, наприклад, у відповідь на натискання кнопки або щось інше, ви можете зробити це:

@IBAction func pushSearchButton(_ sender: UIButton?) {
    if let tabBarController = self.navigationController?.tabBarController  {
        tabBarController.selectedIndex = 1
    }
}

А також ви можете додати код для обробки перемикання вкладок за допомогою методів UITabBarControllerDelegate. Використовуючи теги на базових контролерах перегляду кожної вкладки, ви можете бачити, де ви знаходитесь, і діяти відповідно: Наприклад

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    
    // if we didn't change tabs, don't do anything
    if tabBarController.selectedViewController?.tabBarItem.tag ==  viewController.tabBarItem.tag {
        return false
    }
    
    if viewController.tabBarItem.tag == 4096 { // some particular tab
        // do stuff appropriate for a transition to this particular tab
    }
    else if viewController.tabBarItem.tag == 2048 { // some other tab
        // do stuff appropriate for a transition to this other tab
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.