为什么当视图控制器超过 5 个时,设置选项卡栏控制器的 selectedViewController >= 4 会抛出错误?

Why does setting tab bar controller's selectedViewController >= 4 throw error when there are more than 5 view controllers?

提问人:pitachip 提问时间:9/7/2016 最后编辑:pitachip 更新时间:9/7/2016 访问量:253

问:

我有一个以编程方式导航的 UITabBarController。调用以下方法:

// UITabBarController subclass

- (void)tabForward
{
    NSUInteger selectedIndex = [self.viewControllers indexOfObject:self.selectedViewController];
    selectedIndex = selectedIndex + 1;
    if ( selectedIndex < [self.viewControllers count] )
        self.selectedViewController = [self.viewControllers objectAtIndex:selectedIndex];
}

最初似乎工作正常,但随后同一行 () 抛出错误,当有超过 5 个视图控制器且 selectedIndex == 4 时。但是,如果我只是从选项卡栏控制器中删除任何视图控制器,以使总数达到 5 个或更低的视图控制器,则不会引发错误。这让我发疯了。有谁知道我做错了什么?self.selectedViewController = [self.viewControllers objectAtIndex:selectedIndex];[__NSArrayM insertObject:atIndex:]: object cannot be nil

iOS iPhone UITABBARConfigr

评论

0赞 Callam 9/7/2016
你能添加一段代码吗?
0赞 pitachip 9/7/2016
嗨,是的,我只是编辑以显示更多内容。谢谢!

答:

0赞 Callam 9/7/2016 #1

尝试用这种方法替换您的方法。

// UITabBarController subclass

- (void)tabForward
{
    NSUInteger selectedIndex = [self.viewControllers indexOfObject:self.selectedViewController];
    if (++selectedIndex < [self.viewControllers count]) {
        self.selectedViewController = [self.viewControllers objectAtIndex:selectedIndex];
    }
}

评论

0赞 pitachip 9/7/2016
你是对的,这是一个错误,但这不可能导致错误。
0赞 Callam 9/7/2016
通过检查 ,您基本上可以确定该索引处是否存在对象。但是,您已经知道存在,您需要检查是否存在。使用 ++selectedIndex 会在 if 语句中考虑变量之前将变量的值更新一,现在可用于获取 objectAtIndex,而无需手动添加一个。if (selectedIndex < [self.viewControllers count])selectedIndexselectedIndex + 1
0赞 pitachip 9/7/2016
没错,这就是 -1 出现的原因。但这不是问题所在。错误和错误的情况与此无关。
0赞 Callam 9/7/2016
现在的问题是您正在检查,这告诉您是否是有效的索引。然后你得到,但你还没有检查该索引是否小于计数。selectedIndex < [self.viewControllers count]selectedIndexobjectAtIndex: selectedIndex + 1
0赞 pitachip 9/7/2016
通过检查 ,我有效地检查了 selectedIndex + 1 是否是有效的索引。但我只是编辑了一下,让它更明确。selectedIndex < [self.viewControllers count] - 1
1赞 Callam 9/7/2016 #2
// UITabBarController subclass

- (void)tabForward
{
    NSInteger selectedIndex = [self.viewControllers indexOfObject:self.selectedViewController];
    NSInteger nextIndex = selectedIndex + 1;
    if (nextIndex < self.viewControllers.count) {
        if (nextIndex > 3) { // use navigation controller when selectedIndex >= 4
            self.selectedViewController = self.moreNavigationController;
            [self.moreNavigationController pushViewController:self.viewControllers[nextIndex] animated:YES];
        } else {
            self.selectedViewController = self.viewControllers[nextIndex];
        }
    }
}

评论

0赞 pitachip 9/7/2016
非常感谢!我真的快疯了!我觉得这个想法应该在UITabBarController文档中更明确一些。