使用故事板时设置默认选项卡

58

请问有谁能告诉我在使用iOS中的故事板时如何设置默认选项卡。我似乎无法弄清楚如何实现。

谢谢


默认选项卡是什么意思?您是否正在使用tabBarController并尝试在应用程序启动时选择第一个选项卡? - Dinesh Raja
请确保您的问题描述清楚,并提高您的接受率。 - Dinesh Raja
我使用故事板创建了一个带有选项卡的应用程序,我想将其设置为在应用程序启动时选择第二个选项卡。 - user1145581
1
在你的AppDelegate中为tabBarController创建一个属性,并在applicationDidFinishLaunching:方法中选择你的tabbar项目的索引1。添加如下代码:[tabBarController.tabBar setSelectedItem:1]; - Dinesh Raja
12个回答

126

虽然你可以像其他答案一样通过编程来设置初始选定的选项卡,但是如果要在故事板中实现同样的功能而不需要修改代码,则需按照以下步骤进行:

  1. 在Storyborad界面中选择Tab Bar Controller
  2. 在Utilities面板中显示Identity Inspector
  3. 添加一个新的"User Defined Runtime Attribute"
  4. 将Key Path设置为"selectedIndex"
  5. 将Type设置为"Number"
  6. 将Value设置为您希望选择的选项卡的索引(例如,值为1将选择第二个选项卡)
  7. 保存Storyboard,构建并运行应用程序

当你完成以上步骤后,它应该看起来像这样:


这些指令对我有用,没有子类。(iOS8.3 / Xcode6.3.1) - maninvan
6
对我也不起作用。Xcode 7.2。我得到的错误是:“无法在包中加载 NIB:'NSBundle </Users/...”,导致无法设置(selectedIndex)用户定义的检查属性(UITabBarController)。 - oyalhi
13
使用起来非常方便,但需要注意只能在UITabBarController上使用,而不能在UITabBar或任何嵌套的UIViweController上使用。 - kiecodes
7
不适用于Xcode 7.3。错误信息为“Failed to set (selectedIndex) user defined inspected property on (UITabBarController): Could not load NIB in bundle: 'NSBundle </Users/...” - Burhanuddin Sunelwala
1
注意,这样访问ViewControllers属性/视图会导致预加载调用viewDidLoad。记住这一点。否则,这绝对是最干净的方式。 - Cameron Porter
显示剩余5条评论

78

对于一些人来说,可能会觉得为UITabBarController创建子类有些过度,但我认为这是提供最清晰的解决方案。

  1. 创建BaseTabBarController.swift
  2. 添加一个 @IBInspectable 并在 viewDidLoad 中设置它:

  3. class BaseTabBarController: UITabBarController {
    
        @IBInspectable var defaultIndex: Int = 0
    
        override func viewDidLoad() {
            super.viewDidLoad()
            selectedIndex = defaultIndex
        }
    
    }
    
  4. 在storyboard中,将你的 UITabBarController 设置为你的新子类:

enter image description here

  1. 前往 Attributes Inspector 并设置新属性 Default Index

enter image description here

  1. 完成啦!(:

1
实际上,这是一个非常好的可重用解决方案,而且仍然足够灵活,如果需要可以在代码中进行管理。 - brandonscript
很棒的解决方案@Aviel。谢谢。 - iamyogish
啊,砰!炸药就这样爆炸了 - 这个(Xcode 7.3.1)起作用了。谢谢。 - Jeeves
这个很好用,只是在更改加载到设备之前,我必须进行一次清理和重建,但除此之外,它是一个干净、快速和直观的解决方案。 - hungri-yeti
太棒了!@Aviel Gross,你做得很好! - Vinayak Bhor
1
这应该是所选答案。 - Trev14

36
  1. 创建一个UITabBarController的新文件子类;
  2. viewDidLoad的末尾添加以下内容:

    self.selectedIndex = 1;

  3. 将这个新文件设置为你Storyboard中UITabBarController的自定义类。

完成了。


24

以下代码对我有效:

UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
tabBarController.selectedIndex = 2;

此代码假设rootViewController是tabBarController,但这并不总是正确的。 - oyalhi

12

您可以使用以下两种方法之一:

tabBar.items = tabBarItems;
tabBar.selectedItem = [tabBarItems objectAtIndex:0];

或者从对象中直接获取的方法

[tabBar setSelectedItem:myUITabBarItem];

或者您可以将它们组合起来做到这一点:

tabBar.items = tabBarItems;
[tabBar setSelectedItem:[tabBarItems objectAtIndex:0]];

但我还没有测试过这种方法,希望这可以帮到你!


1
我该如何为tabbar控制器创建outlet属性?由于我是Storyboard的新手,请告诉我。 - Rahul Singh
是的,我个人不擅长故事板设计,如果您需要,我可以发送给您一些代码? - Trevor Rudolph
1
让我试着找到准确的代码并将其放在Pastebin上,否则我会将它压缩并放在我的网站上。 - Trevor Rudolph
这是对一个不同问题的绝佳回答。 - Bradley Thomas
1
对于Swift 5(Xcode 10.2),不再允许直接修改由选项卡控制器管理的选项卡栏。@Aviel Gross的子类解决方案仍然有效:selectedIndex = defaultIndex - emmics

4
在AppDelegate文件中找到applicationDidBecomeActive函数,并添加以下行:
let tabBarController = self.window?.rootViewController as! UITabBarController
tabBarController.selectedIndex = 0 // any index you want

你怎么知道rootViewController总是tabBarController? - oyalhi
当我们使用选项卡栏时,默认情况下tabBarController是rootViewController。除非您在初始化后更改了rootViewController。 - zizutg
我在“SceneDelegate”的“willConnectTo”方法中完成了它,我在那里设置了rootViewController,并且运行良好。 - Mahdi Moqadasi

3

如果您只想更改默认选定的控制器,而不需要进行其他自定义,则我的变体非常适合。只需添加以下类别

//  UITabBarController+DefaultPage.h
#import <UIKit/UIKit.h>

@interface UITabBarController(DefaultPage)

@end


//  UITabBarController+DefaultPage.m
#import "UITabBarController+DefaultPage.h"

@implementation UITabBarController(DefaultPage)

- (void)viewDidLoad {
    [super viewDidLoad];

    self.selectedIndex = 1;
}

@end

p.s: I prefer @joshua-finch answer


2
TabBarControllerviewDidLoad()方法中,将selectedIndex设置为你想要的索引值。(0为第一个,3为第四个,以此类推。)

1
你可以通过 Xcode 8 或更高版本实现这一点(我刚测试过,不知道在此版本之前是否可用)。
按照 @Joshua Finch 的步骤进行,但是:
  1. 选择条目而不是 TabBar
  2. 转到“用户定义的运行时属性”
  3. 添加新键
  4. 将其命名为“selected”
  5. 将其类型设置为布尔值并选择 true / 或选中复选框

“xcode 8或之前”:你真的是指“之前”吗?这似乎与下一句话“不知道在此版本之前是否可用”相矛盾。也许你的意思是“8或更高版本”? - Fabio says Reinstate Monica

0
在 Aviel Gross 的回答基础上,我想实现这个功能用于 UITabBar,而不是 UITabBarController。可以按照以下步骤完成:
class BaseTabBar: UITabBar {

    @IBInspectable var defaultIndex: Int = 0 {
        didSet {
            self.selectedItem = self.items?[defaultIndex]
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接