【问题标题】:Programmatically changing the selected tab of tabBarController以编程方式更改 tabBarController 的选定选项卡
【发布时间】:2011-06-12 14:36:58
【问题描述】:

我在 xcode 中创建了一个基本项目作为“选项卡栏应用程序”,如果 BOOL x 为真,我希望在加载时将应用程序切换到第二个选项卡。

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

if(x){
    [self.tabBarController setSelectedIndex:1];
}

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

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

【问题讨论】:

  • 你所拥有的在表面上是正确的。我怀疑标签栏控制器的设置方式有些奇怪。如果您要记录标签栏控制器的 viewControllers 属性,您会看到不同的视图控制器吗?
  • 是的,如果我记录 viewControllers 我会在我的项目中返回一个包含 3 个控制器的数组。
  • 好的,那么如果您在调用 -setSelectedIndex: 之前和之后记录标签栏控制器的 selectedViewController 属性,这些控制器是您期望的,还是保持不变?
  • 第二个显示了我的期望,但是在运行 setSelectedIndex 之前它显示 (null)
  • 好吧,我玩了一下。如果我将代码移动到一个按钮而不是 viewDidLoad 它可以工作。我如何让它在 viewDidLoad 中工作?

标签: iphone objective-c


【解决方案1】:

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

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

到:

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

现在,至于为什么会这样,我只能猜测,没有更多的挖掘,它与初始化的顺序有关。您的视图控制器的 viewDidLoad 可能在父标签栏控制器完成自己的初始化之前被调用。等到您的视图真正出现之前,可以确保所有内容都已加载并处于一致状态。

【讨论】:

  • 这对我不起作用。我不知道为什么..我把相同的代码 [self.tabBarController setSelectedIndex:1];在按下按钮时执行的函数中。你有什么想法吗?
  • @acecapades,您是说代码在按钮处理程序中不起作用
  • @MattWilding 我同意你的观点,它应该可以工作。好吧,至少在我的程序中没有。诡异的。我再检查一遍,很可能是我的代码有其他问题。
  • if 语句中 x 的值是多少
【解决方案2】:

假设您使用的控制器是 UITabBarController 的子类,您只需要设置 selectedIndex 属性。

例如:

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

我更喜欢在 viewDidLoad 方法中执行此分配,这样可以保证只显示所选索引处的视图控制器。如果你使用 viewDidAppear 函数,当标签栏视图在索引 1 的视图显示之前加载时,你会看到索引 0 的视图控制器短暂显示。

【讨论】:

  • 我尝试了很多东西。这是唯一一个工作的,谢谢
【解决方案3】:

这就足够了:

[tabBar setSelectedIndex:0];

【讨论】:

    【解决方案4】:
    [self.tabBarController setSelectedIndex:1]
    [window addSubview:[tabBarController view]];
    [window makeKeyAndVisible];
    

    【讨论】:

    • 我得到窗口未声明,如果我将其切换到 self.window,它会出错并显示“请求成员 'window' 在不是结构或联合的东西中”
    • 此代码旨在从应用程序委托的 -applicationDidFinishLaunching: 运行。它不会从您的视图控制器的实现中按原样工作。
    • 这是我的问题,这确实需要从视图控制器运行。我已经简化了上面的问题,但我不知道天气是否需要将它们发送到选项卡,直到在该特定视图上完成一些加载。
    【解决方案5】:

    对于 Swift 3.0

    if(x)
    { 
      self.tabBarController?.selectedIndex = 1
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-13
      • 2021-12-08
      • 1970-01-01
      相关资源
      最近更新 更多