以编程方式设置UITabBarController的viewControllers和selectedIndex结果没有选定的UITabBarItem

时间:2014-04-07 06:15:38

标签: ios objective-c uitabbarcontroller uitabbaritem

我在iOS 6和7中都有一个奇怪的错误,其中包含以下UITabBarController子类代码:

self.viewControllers = @[self.myKitchenNavigationController,
                         self.photosIndexNavigationController,
                         self.postNavigationController,
                         self.feedNavigationController,
                         self.talkNavigationController];

self.selectedIndex = 0;
// self.selectedViewController = self.myKitchenNavigationController; // This doesn't help either

如果我以编程方式设置viewControllers(之前为nil)并立即设置selectedIndex,则会显示标签栏,但没有选择。

我的印象是在修改控制器之后设置一个选定的索引是某种方式"也是#34;很快,所以我把这个电话包裹在dispatch_async电话中:

// Fix selection by dispatching async
dispatch_async(dispatch_get_main_queue(), ^
{
    self.selectedIndex = 0;
});

现在它可以工作,但我想知道这是否是一个长期存在的SDK。


实际上错误仍然存​​在,完整的方法:

- (void)setMode:(RootViewControllerMode)mode
{
    if (_mode == mode)
        return;

    NBULogInfo(@"%@ %d", THIS_METHOD, mode);

    _mode = mode;

    switch (mode)
    {
        case RootViewControllerLoggedMode:
        {
            self.viewControllers = @[self.myKitchenNavigationController,
                                     self.photosIndexNavigationController,
                                     self.postNavigationController,
                                     self.feedNavigationController,
                                     self.talkNavigationController];

            // Fix selection by dispatching async
            dispatch_async(dispatch_get_main_queue(), ^
            {
                self.selectedIndex = 0;
            });

            // Adjust post button
            self.postButtonHidden = NO;
            [self.view addSubview:self.postButton];
            break;
        }
        case RootViewControllerNotLoggedMode:
        {
            self.viewControllers = nil;

            // Remove post button to tabBar
            [self.postButton removeFromSuperview];
            break;
        }
        default:
        case RootViewControllerEmptyMode:
        {
            self.viewControllers = nil;
            break;
        }
    }
}

这是唯一触及标签栏控件的viewControllers和当前所选标签的代码。

已经验证过这是在主线程上调用的,然后还尝试将所有内容包装在主队列中的dispatch_async内,最后尝试dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(),但问题仍然存在。

2 个答案:

答案 0 :(得分:1)

修改标签栏的viewControllers似乎非常提示错误,除了此处的问题,标签项徽章有时会出现在selectionIndicatorImage后面。

我们最终在故事板中设置控制器,并避免修改控制器或其顺序。

答案 1 :(得分:0)

YourAppDelegate* appDelegate = (id)[UIApplication sharedApplication].delegate;
appDelegate.yourTabBar.selectedIndex = 1;