【问题标题】:Tab bar Controller raising NSInternalInconsistencyException标签栏控制器引发 NSInternalInconsistencyException
【发布时间】:2009-07-10 10:19:04
【问题描述】:

在我的基于 SDK 3.0 核心数据的应用程序中,我有一个标签栏控制器管理 4 个标签。有时,显然是随机的,当我启动该应用程序时,它会崩溃并显示以下消息:

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“不允许直接修改由标签栏控制器管理的标签栏。”

但是,我没有在我的代码中修改任何选项卡,但以下选项除外。实际上,选项卡中的所有导航控制器或控制器都是使用 IB 设置的,在我的代码中,我已将其中两个声明为插座,因为我需要在我的应用程序委托 applicationDidFinishLaunching() 方法中访问它们以设置它们的核心数据 managedObjectContext 如下:

 [self managedObjectContext];
 [self managedObjectModel];
 [self persistentStoreCoordinator];
 [rootViewController retain];
 rootViewController.managedObjectContext = self.managedObjectContext;

这不正确吗?如果有,为什么?

我在网上看到的问题的唯一参考在这里:

http://discussions.apple.com/thread.jspa?messageID=9716886

但是,即使在 IB 中从头开始删除并重新创建标签栏控制器后,问题仍然存在。

有什么线索吗? 提前致谢。

【问题讨论】:

    标签: iphone iphone-sdk-3.0


    【解决方案1】:

    我也遇到过这个问题。笔尖中的UITabBar 本身(不是UITabBarController)有出口吗?当我删除它时,我不再有问题了。

    抱歉,这不是 100% 可靠的解释,但此解决方法为我解决了问题。

    【讨论】:

    • 谢谢弗雷泽,至少现在你的建议似乎解决了这个问题。但问题仍然存在。
    • 如何移除那个 UITabBar Outlet?
    【解决方案2】:

    我曾多次遇到此异常,尤其是在使用本地化进行更改时。清理目标然后重建似乎可以解决这个问题。

    【讨论】:

    • 是的,我也注意到了这一点。最近我不得不再次向 UITabBar 添加一个出口,我又开始面临这个问题。我希望苹果能解决这个问题,同时最重要的是应用程序在实际设备上运行时不会崩溃。
    • 不要让这个错误存在于您的代码中。我的游戏 HexaLex 每隔几百次构建就会遇到这个错误。我无法找到一个永久性的修复方法,但我并没有太担心它,因为它非常罕见。自然,我为 v1.0 构建的 App Store 受到了影响,彻底破坏了我的发布。在那之后,我深入研究并意识到在某些时候我已经将一个插座连接到 Interface Builder 中的 UITabBar。注意我的警告:远离 UITabBar!
    【解决方案3】:

    我快速编写了以下类,并在 UITabBarController 中显示/隐藏选项卡视图就像魔术一样工作:

    TabBarDesigner.h

    #import <Foundation/Foundation.h>
    @interface TabBarDesigner : NSObject 
    {
    
    }
    
    +(void) setTabBarController:(UITabBarController *)tabBarController
                          items:(NSArray *)tabBarItems 
                viewControllers:(NSArray *)viewControllers;
    
    +(void) removeItemsInRange:(NSRange) range;
    
    @end
    

    TabBarDesigner.m

    #import "TabBarDesigner.h"
    
    static NSArray *_tabBarItems = NULL;
    static NSArray *_viewControllers = NULL;
    static UITabBarController *_tabBarController = NULL;
    
    @implementation TabBarDesigner
    
    +(void) setTabBarController:(UITabBarController *)tabBarController
                          items:(NSArray *)tabBarItems 
                viewControllers:(NSArray *)viewControllers
    {
        if (tabBarItems && viewControllers && tabBarController)
        {
            if ([tabBarItems count] == [viewControllers count])
            {
                [_tabBarItems release];
                [_viewControllers release];
                _tabBarItems = [tabBarItems copy];
                _viewControllers = [viewControllers copy];
                _tabBarController = tabBarController;
            }
        }
    }
    
    +(void) removeItemsInRange:(NSRange) range
    {
        if (_tabBarController)
        {
            if ( range.location < ([_tabBarItems count] - 1) )
            {
                if ( (range.length + range.location) < [_tabBarItems count] )
                {
                    NSMutableArray *tabBarItems = [_tabBarItems mutableCopy];   
                    [tabBarItems removeObjectsInRange:range];
                    NSMutableArray *viewControllers = [_viewControllers mutableCopy];
                    [viewControllers removeObjectsInRange:range];
                    [_tabBarController setViewControllers:viewControllers];
                     NSUInteger i;
                    for (i = 0; i< [viewControllers count]; i++) 
                    {
                        UIViewController *vC = [viewControllers objectAtIndex:i];
                        vC.tabBarItem.image = [[tabBarItems objectAtIndex:i] image];
                        vC.tabBarItem.title = [[tabBarItems objectAtIndex:i] title];
                        vC.tabBarItem.tag = [[tabBarItems objectAtIndex:i] tag];
                    }
    
                    [tabBarItems release];
                    [viewControllers release];
    
                }
    
    
            }
        }
    }
    
    
    @end
    

    如何使用此类的示例: 在你的 MyAppDelegate.m

    #import "TabBarDesigner.h"
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        [TabBarDesigner setTabBarController:_tabBarController
                                      items:[_tabBarController.tabBar items] 
                            viewControllers:[_tabBarController viewControllers]];
        // remove the first 3 tabs
        [TabBarDesigner removeItemsInRange:NSMakeRange(0,3)];
        // show all tabs
        [TabBarDesigner removeItemsInRange:NSMakeRange(0,0)];
        // continue with your code
    }
    

    干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      相关资源
      最近更新 更多