我在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()
,但问题仍然存在。
答案 0 :(得分:1)
修改标签栏的viewControllers
似乎非常提示错误,除了此处的问题,标签项徽章有时会出现在selectionIndicatorImage
后面。
我们最终在故事板中设置控制器,并避免修改控制器或其顺序。
答案 1 :(得分:0)
YourAppDelegate* appDelegate = (id)[UIApplication sharedApplication].delegate;
appDelegate.yourTabBar.selectedIndex = 1;