在应用程序启动时预加载 UITabBar 选项卡时出现问题(崩溃)

Posted

技术标签:

【中文标题】在应用程序启动时预加载 UITabBar 选项卡时出现问题(崩溃)【英文标题】:Trouble preloading UITabBar tabs on application launch (crash) 【发布时间】:2014-03-07 03:10:33 【问题描述】:

我在 RSS 新闻阅读器中有 8 个标签。每个选项卡链接到一个导航控制器,该控制器链接到一个包含表视图的 masterViewController。我正在尝试遍历所有选项卡以在启动时预加载其表数据。我在 appDelegate didFinishLaunchingWithOptions 方法中尝试了以下代码:

UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
NSArray *myViewControllers = tabBarController.viewControllers;
for (UINavigationController *navViewController in myViewControllers)

    [navViewController.topViewController view];

但是,每当我启动应用程序时,我都会收到以下错误消息:

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI       
objectAtIndex:]: index 2147483647 beyond bounds [0 .. 7]'

这里有什么问题?

【问题讨论】:

这很奇怪......当您调用超出数组中当前内容的索引时会发生该错误。但是,由于您正在执行没有索引的 for 循环,因此它来自该 for 循环是没有意义的……您确定它来自这部分代码吗? 哦,刚刚想到一个可能的原因……一秒…… 【参考方案1】:

我怀疑问题可能是这样的

NSArray *myViewControllers = tabBarController.viewControllers;

正在返回一个 UIViewControllers 数组(我认为应该如此),但您的 for 循环正在寻找 UINavigationControllers。

我不知道你想用那个循环做什么,因为你没有分配或使用 [navViewController.topViewController view]; 做任何事情,但是如果你想访问你的 myViewControllers 数组中的视图控制器的视图, 使用:

for (UIViewController *viewController in myViewControllers)

    variableWhatever = [viewController view];

【讨论】:

我正在关注这个帖子:link,以便在应用程序启动时预加载我所有选项卡的表数据。但是他们的解决方案不起作用,所以我想在我的 masterViewController 而不是 navigationController 上调用“view”。您的解决方案消除了崩溃,但仍然不会导致我的标签页预加载。 总而言之,我只是想遍历我所有的 masterViewControllers,并在它们上调用视图来强制加载每个选项卡的表数据。

以上是关于在应用程序启动时预加载 UITabBar 选项卡时出现问题(崩溃)的主要内容,如果未能解决你的问题,请参考以下文章

选择 UITabBar 时调用方法?

在应用程序启动时预加载 Ext JS 和自定义 JavaScript 文件

UITabBar 中的 UICollectionView 在首次加载时显示错误的位置

基于spring的web项目启动时预加载数据到ServletContext

如何在应用启动时加载其他选项卡的视图?

如何在 iOS 中向 UIView 添加第二个 UITabBar(控制器?)