在Swift中以编程方式在选项卡之间切换


79

我需要编写一些代码以在iOS应用启动时将视图切换到另一个选项卡(例如,默认情况下显示第二个选项卡,而不是第一个)。

我是Swift的新手,并且已经完成以下工作:

  • 该代码可能应该放在第一个选项卡的ViewController的重写func viewDidLoad()函数中。

  • 以下代码显示了第二个ViewController,但没有在底部显示标签栏(vcOptions是第二个ViewController标签项:

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

我认为答案可能在于使用UITabbarController.selectedIndex = 1,但不确定如何实现。

Answers:


136

如果您window rootViewControllerUITabbarController(这是在大多数情况下),那么你可以访问tabbardidFinishLaunchingWithOptionsAppDelegate文件。

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 }
MarcinŚwierczyński2015年

您不能在其中执行以下操作TabBarViewControllerclass TabBarViewController: UITabBarController { override func viewDidLoad() { super.viewDidLoad() selectedIndex = 1 }在这种情况下,将只选择OP想要执行的第二个选项卡。
Korpel '16

只需替换as UITabBarControlleras! 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个标签的中间(第3个)标签。类PatientTabBarController:UITabBarController {覆盖func viewDidLoad(){super.viewDidLoad()selectedIndex = 2}}
Brian

28

迅捷3

您可以将此代码添加到index 0tabBarController中的默认视图控制器():

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

加载后,这将自动将选项卡移动到列表中的第二项,但也允许用户随时手动返回该视图。


3
为什么不使用“ tabBarController?.selectedIndex = 1”呢?
Ahmadreza

您应该经常致电super.viewWillAppear()。同样,_ = 不必分配。
科恩

20

viewController必须是UITabBarControllerDelegate的子级。因此,您只需要在SWIFT 3上添加以下代码

self.tabBarController?.selectedIndex = 1

18

要扩展@codester的答案,您无需检查然后分配,可以一步完成:

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,则可以在该视图控制器的prepare(for 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
        }

    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.