以编程方式更改tabBarController的选定选项卡

Mik*_*tar 31 iphone objective-c

我有一个在xcode中创建的基本项目作为"标签栏应用程序",如果BOOL x为真,我希望将应用程序加载切换到第二个标签.

现在我有:(位于viewDidLoad中的FirstViewController.m)

if(x){
    [self.tabBarController setSelectedIndex:1];
}
Run Code Online (Sandbox Code Playgroud)

这会导致页面底部的选定选项卡突出显示第二个选项卡,但视图仍然是第一个选项卡的视图.

我如何将视图更改为第二个选项卡的视图?

Mat*_*ing 48

好吧,我重现了你的问题,并通过将切换逻辑从-viewDidLoad移动到-viewDidAppear:来解决它.基本上,改变:

- (void)viewDidLoad {
    // Other code...
    if(x){
        [self.tabBarController setSelectedIndex:1];
    }
}
Run Code Online (Sandbox Code Playgroud)

至:

- (void)viewDidAppear:(BOOL)animated {
    // Other code...
    if(x){
        [self.tabBarController setSelectedIndex:1];
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,至于为什么会出现这种情况,我只能在没有更多挖掘的情况下猜测它与订单的初始化有关.在父标签栏控制器完成自己的初始化之前,可能会调用视图控制器的viewDidLoad.暂停直到您的视图实际出现确保一切都已加载并处于一致状态.


Chr*_*s J 9

假设您正在使用作为UITabBarController的子类的控制器,您只需要设置selectedIndex属性.

例如:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.selectedIndex = 1;
}
Run Code Online (Sandbox Code Playgroud)

我更喜欢在viewDidLoad方法中执行此赋值,因此可以保证只显示所选索引处的视图控制器.如果使用viewDidAppear函数,则会在标签栏视图加载之前看到索引0处的视图控制器短暂显示,然后显示索引1处的视图控制器.