Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 以编程方式设置UITabBarController';s ViewController和selectedIndex将导致未选择UITableItem_Ios_Objective C_Uitabbarcontroller_Uitabbaritem - Fatal编程技术网

Ios 以编程方式设置UITabBarController';s ViewController和selectedIndex将导致未选择UITableItem

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,

我在iOS 6和iOS 7中都有一个奇怪的bug,它包含以下
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:
正在从
主线程调用。