Ios 以编程方式设置UITabBarController';s ViewController和selectedIndex将导致未选择UITableItem
我在iOS 6和iOS 7中都有一个奇怪的bug,它包含以下Ios 以编程方式设置UITabBarController';s ViewController和selectedIndex将导致未选择UITableItem,ios,objective-c,uitabbarcontroller,uitabbaritem,Ios,Objective C,Uitabbarcontroller,Uitabbaritem,我在iOS 6和iOS 7中都有一个奇怪的bug,它包含以下UITabBarController子类代码: self.viewControllers = @[self.myKitchenNavigationController, self.photosIndexNavigationController, self.postNavigationController,
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
,则选项卡栏将显示,没有选择
我的印象是,在修改控制器之后设置所选索引不知何故“太早了”,因此我将该调用包装在dispatch\u async
调用中:
// Fix selection by dispatching async
dispatch_async(dispatch_get_main_queue(), ^
{
self.selectedIndex = 0;
});
现在它可以工作了,但我想知道这是否是一个SDK长期存在的错误
其实bug还在,完整的方法是:
- (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\u async
,最后尝试在(dispatch\u time(dispatch\u time\u NOW,(int64\t)(0.5*NSEC\u/SEC))、dispatch\u get\u main\u queue()之后执行dispatch\u
,但问题仍然存在。修改选项卡栏的viewControllers
似乎是一个相当大的错误提示,除了这里的问题之外,选项卡项标记有时也会出现在选择指示图像的后面
YourAppDelegate* appDelegate = (id)[UIApplication sharedApplication].delegate;
appDelegate.yourTabBar.selectedIndex = 1;
我们最终在故事板中设置控制器,避免修改控制器或其顺序。在UITabBarController子类中的“self.viewControllers
”设置在哪里?在-(void)设置模式中:(RootViewControllerMode)模式
属性,该属性在成功登录时被模式登录控制器调用,然后在加载所有视图和控制器之后被解除。我猜您正在登录api的完成处理程序中设置viewcontrollers
,或者在可能未在mainthread
中运行的委托函数中设置viewcontrollers
,并且因此,selectedindex
不起作用,尽管您通过在分派主线程中进行UI更改得到了正确的解决方案。可能是的!尽管它也适用于dispatch\u get\u current\u queue()
在我编辑这个问题之前。我会尝试一下。好吧,刚刚检查过,setMode:
正在从主线程调用。